// WebMSX version 6.0.4 // Copyright 2015 by Paulo Augusto Peccin. See license.txt distributed with this file. // Main Emulator parameters. // May be overridden dynamically by JS code, external Config File or URL query parameters WMSX = { // Main Setup ENVIRONMENT: 0, // 0: Default Emulator Environment. 1..99: Custom User Environment CONFIG_URL: "", // Configuration file to merge. Processed before URL parameters MACHINE: "", // Machine Type. See Machine Configuration. Leave blank for auto-detection PRESETS: "", // Configuration Presets to apply. See Presets Configuration // Full or relative URL of Media files to load CARTRIDGE1_URL: "", // ROM file CARTRIDGE2_URL: "", DISKA_URL: "", // Disk Image file DISKB_URL: "", HARDDISK_URL: "", DISKA_FILES_URL: "", // File to load into a Disk. For several files, use a ZIP file DISKB_FILES_URL: "", HARDDISK_FILES_URL: "", TAPE_URL: "", // Disk Image file STATE_URL: "", // Save State file AUTODETECT_URL: "", // Open any file in auto-detect mode // Forcing ROM formats CARTRIDGE1_FORMAT: "", // Normal, ASCII8, ASCII16, Konami, KonamiSCC, KonamiSCCI, FMPAC, etc... CARTRIDGE2_FORMAT: "", // BASIC loading/typing commands. Not needed for AUTOEXEC.BAS, AUTOEXEC.BAT or Tape Images BASIC_RUN: "", BASIC_LOAD: "", BASIC_BRUN: "", BASIC_BLOAD: "", BASIC_TYPE: "", BASIC_ENTER: "", // Boot Options BOOT_KEYS: "", // Keys to keep pressed at every boot, comma separated BOOT_KEYS_ONCE: "", // Same as above, but only on first boot (do not use both) BOOT_KEYS_FRAMES: -1, // -1: auto; > 0: number of frames for Boot Keys FAST_BOOT: 0, // 0: off; 1: auto (same as Boot Keys frames); > 1: number of frames for 10x speed at boot // NetPlay NETPLAY_JOIN: "", // Join NetPlay! Session automatically NETPLAY_NICK: "", // NetPlay! Nickname, optional // Internal Machine configuration BIOS_SLOT: [0], // Slot to use when loading ROM of type CARTRIDGE1_SLOT: [1], CARTRIDGE2_SLOT: [2], EXPANSION1_SLOT: [2, 1], EXPANSION2_SLOT: [2, 2], BIOSEXT_SLOT: [3, 1], RAMMAPPER_SIZE: 512, // 64, 128, 256, 512, 1024, 2048, 4096: RAM Mapper size in KB when active RAMNORMAL_SIZE: 64, // 16..64: Normal RAM size in KB when active MEGARAM_SIZE: 2048, // 256, 512, 1024, 2048: MegaRAM size in KB EXTENSIONS: { }, // Extensions active. See Extensions Configuration. Use Presets to activate/deactivate RTC_ACTIVE: -1, // -1: auto; 0: not present; 1: present VDP_TYPE: -1, // -1: auto; 1: V9918; 2: V9938; 3: V9958 VDP_PALETTE: 2, // 0: WebMSX Original; 1: V9918; 2: V9928; 3: V9938; 4: Toshiba; 5: Fujitsu FM-X // General options VOL: 1.0, // Master Volume factor SPEED: 100, // Default emulation speed (in %) AUTO_START: true, AUTO_POWER_ON_DELAY: 1200, // -1: no auto Power-ON; >= 0: wait specified milliseconds before Power-ON MEDIA_CHANGE_DISABLED: false, // Prevents user form changing Machine Type, Extensions and Medias (Disks, Carts, Tapes) SCREEN_RESIZE_DISABLED: false, SCREEN_ELEMENT_ID: "wmsx-screen", SCREEN_FULLSCREEN_MODE: -1, // -2: disabled; -1: auto; 0: off; 1: on (Full Screen); 2: on (Full Windowed) SCREEN_FILTER_MODE: -3, // -3: user set (default auto); -2: browser default; -1: auto; 0..3: smoothing level SCREEN_CRT_SCANLINES: -1, // -1: user set (default off); 0: off; 1..10: level SCREEN_CRT_PHOSPHOR: -1, // -1: auto; 0: off; 1: on SCREEN_DEFAULT_SCALE: -1, // -1: auto; 0.5..N in 0.05 steps: scale SCREEN_DEFAULT_ASPECT: 1.14, // in 0.01 steps SCREEN_CONTROL_BAR: 1, // 0: on hover; 1: always SCREEN_FORCE_HOST_NATIVE_FPS: -1, // -1: auto. Don't change! :-) SCREEN_VSYNC_MODE: -2, // -2: user set (default auto); -1: disabled; 0: off; 1: auto (on when available) SCREEN_VIDEO_OUT: -1, // -1: auto; 0: Internal VDP; 1: External V9990; 2: Superimposed; 3: Mixed; 4: Dual (main: Internal); 5: Dual (main: V9990) SCREEN_COLORS: 0, // 0: Color (default); 1: B&W; 2: Green Phosphor; 3: Amber Phosphor AUDIO_MONITOR_BUFFER_BASE: -3, // -3: user set (default auto); -2: disable audio; -1: auto; 0: browser default; 1..6: base value. More buffer = more delay AUDIO_MONITOR_BUFFER_SIZE: -1, // -1: auto; 256, 512, 1024, 2048, 4096, 8192, 16384: buffer size. More buffer = more delay. Don't change! :-) AUDIO_SIGNAL_BUFFER_RATIO: 2, // Internal Audio Signal buffer based on Monitor buffer AUDIO_SIGNAL_ADD_FRAMES: 3, // Additional frames in internal Audio Signal buffer based on Monitor buffer JOYSTICKS_MODE: 0, // -1: disabled; 0: auto; 1: auto (swapped) JOYKEYS_MODE: -1, // -1: disabled; 0: enabled at port 1; 1: enabled at port 2; 2: enabled at both ports; 3: enabled at both ports (swapped) MOUSE_MODE: -1, // -1: disabled; 0: auto; 1: enabled at port 1; 2: enabled at port 2 TOUCH_MODE: 0, // -1: disabled; 0: auto; 1: enabled at port 1; 2: enabled at port 2 MOBILE_MODE: 0, // -1: disabled; 0: auto; 1: enabled (forced) R800_CLOCK_MODE: 0, // 0: auto; (0..2]: R800 CPU clock multiplier; R800_TIMING: 1, // 0: off, 1: on; 2: VDP waits only. Precise R800/S1990 timings. Turn off for faster and lighter emulation Z80_CLOCK_MODE: 0, // 0: auto (soft-turbo possible); (0..8]: Z80 CPU clock multiplier; VDP_CLOCK_MODE: 0, // 0: auto (soft-turbo possible); (0..8]: VDP Command Engine clock multiplier; 9: instantaneous Z80_SOFT_TURBO_MULTI: 1.5, // 1..8 Z80 CPU clock multiplier when in AUTO mode and activated by software or CPU_SOFT_TURBO_AUTO_ON VDP_SOFT_TURBO_MULTI: 1, // 1..9 VDP Command Engine clock multiplier when in AUTO mode and activated by software or CPU_SOFT_TURBO_AUTO_ON CPU_SOFT_TURBO_AUTO_ON: 0, // 0: off, 1: on. Automatically activate the CPU Soft Turbo when supported by machine CPU_FAKE_TR_TURBO: -1, // -1: auto; 0: off; 1: on. Simulated tR CHGCPU Turbo activation. Auto ON for 2+, never for tR CPU_PANA_TURBO: -1, // -1: auto; 0: off; 1: on. Simulated Panasonic Turbo activation. Auto ON for 2+, never for tR KEYBOARD_JAPAN_LAYOUT: 1, // 0: ANSI; 1: JIS DEBUG_MODE: 0, // 0: off; 1..7: debug mode. Don't change! :-) SPRITES_DEBUG_MODE: 0, // 0: off; 1: unlimited; 2: no collisions; 3: both. May cause problems :-) ROM_MAX_HASH_SIZE_KB: 5120, // Maximum ROM size for Hash calculation HARDDISK_MIN_SIZE_KB: 720, // Minimum file size to be accepted as HardDisk image (besides all valid Floppy formats) DISK_ROM_START_PAGE: 0, // 0..1: Change starting page for ROMs > 16KB when format is DiskPatch LIGHT_STATES: true, PSG_VOL: "f", // 0..f (hex digit): PSG Volume adjust. Set globally or for each channel (4 values) PSG_PAN: "8", // 0; 1..8..f (hex digit): PSG PanPot adjust. Set globally or for each channel (4 values) SCC_VOL: "f", // SCC Volume adjust. Same as above (5 values) SCC_PAN: "8", // SCC PanPot adjust. Same as above (5 values) OPLL_VOL: "f", // OPLL Volume adjust. Same as above (14 values) OPLL_PAN: "8", // OPLL PanPot adjust. Same as above (14 values) IMAGES_PATH: window.WMSX_IMAGES_PATH || "images/", FILE_SEPARATOR_REGEX: /[\\/?:]/, PAGE_BACK_CSS: "", // CSS to modify page background color. Applied to the body element SERVER_ADDRESS: "webmsx.azurewebsites.net/", SERVER_KEEPALIVE: 0, STATE_VERSION: 600, STATE_VERSIONS_ACCEPTED: { 9: true, 50: true, 51: true, 511: true, 520: true, 530: true, 600: true }, ALLOW_URL_PARAMETERS: true // Allows user to override any of these parameters via URL query parameters }; WMSX.MACHINES_CONFIG = { MSXTR: { DESCX: "MSX turbo R Auto Detect", AUTO_TYPE: 4 }, MSX2P: { DESCX: "MSX2+ Auto Detect", AUTO_TYPE: 3 }, MSX2: { DESCX: "MSX2 Auto Detect", AUTO_TYPE: 2 }, MSX1: { DESCX: "MSX Auto Detect", AUTO_TYPE: 1 }, MSXTRA: { DESC: "MSX turbo R America (NTSC)", TYPE: 4, PRESETS: "_MSXTRA" }, MSXTRE: { DESC: "MSX turbo R Europe (PAL)", TYPE: 4, PRESETS: "_MSXTRE" }, MSXTRJ: { DESC: "MSX turbo R Japan (NTSC)", TYPE: 4, PRESETS: "_MSXTRJ", LANG: "ja" }, MSX2PA: { DESC: "MSX2+ America (NTSC)", TYPE: 3, PRESETS: "_MSX2PA" }, MSX2PE: { DESC: "MSX2+ Europe (PAL)", TYPE: 3, PRESETS: "_MSX2PE" }, MSX2PJ: { DESC: "MSX2+ Japan (NTSC)", TYPE: 3, PRESETS: "_MSX2PJ", LANG: "ja" }, MSX2A: { DESC: "MSX2 America (NTSC)", TYPE: 2, PRESETS: "_MSX2A" }, MSX2E: { DESC: "MSX2 Europe (PAL)", TYPE: 2, PRESETS: "_MSX2E" }, MSX2J: { DESC: "MSX2 Japan (NTSC)", TYPE: 2, PRESETS: "_MSX2J", LANG: "ja" }, MSX1A: { DESC: "MSX America (NTSC)", TYPE: 1, PRESETS: "_MSX1A" }, MSX1E: { DESC: "MSX Europe (PAL)", TYPE: 1, PRESETS: "_MSX1E" }, MSX1J: { DESC: "MSX Japan (NTSC)", TYPE: 1, PRESETS: "_MSX1J", LANG: "ja" }, EMPTYTR: { DESCX: "MSX2 turbo R Empty (NTSC)", TYPE: 4, PRESETS: "_EMPTY" }, EMPTY2P: { DESCX: "MSX2+ Empty (NTSC)", TYPE: 3, PRESETS: "_EMPTY" }, EMPTY2: { DESCX: "MSX2 Empty (NTSC)", TYPE: 2, PRESETS: "_EMPTY" }, EMPTY1: { DESCX: "MSX Empty (NTSC)", TYPE: 1, PRESETS: "_EMPTY" } }; WMSX.EXTENSIONS_CONFIG = { HARDDISK: { DESC: "Hard Drive", URL: "@[Nextor16Patch].rom", SLOT: [2, 3], SLOT2: [3, 2], TOGGLE: "DISK", CHANGE: { RAMMAPPER: 1 } }, DISK: { DESC: "Floppy Drives", URL: "@[DiskPatch].rom", SLOT: [2, 3], SLOT2: [3, 2], TOGGLE: "HARDDISK" }, RAMMAPPER: { DESC: "RAM Mapper", URL: "@[RAMMapper].rom", SLOT: [3], MUTUAL: "RAMNORMAL" }, RAMNORMAL: { URL: "@[RAMNormal].rom", SLOT: [3], MUTUAL: "RAMMAPPER" }, KANJI: { DESC: "Kanji Support", URL: "@[Kanji1].rom", SLOT: [4, 0], BOUND: [ "KANJIDRV", "MSXJE" ] }, KANJIDRV: { URL: "@KanjiBasicOnly.bios", SLOT: [2, 1] }, MSXJE: { URL: "@[MSXJE].rom", SLOT: [2, 2] }, V9990: { DESC: "V9990 Video", URL: "@[V9990].rom", SLOT: [4, 3] }, MSXMUSIC: { DESC: "MSX-MUSIC", URL: "@[MSXMUSIC].rom", SLOT: [3, 3], BOUND: [ "MSXMUSICX" ] }, MSXMUSICX: { URL: "", SLOT: [0, 2] }, OPL4: { DESC: "OPL4 Wave", URL: "@[OPL4].rom", SLOT: [4, 1] }, DOUBLEPSG: { DESC: "Double PSG", URL: "@[ExtraPSG].rom", SLOT: [4, 2] }, SCCI: { DESC: "Konami SCC+", URL: "@[SCCIExpansion].rom", SLOT: [1], SLOT2: [2], CHANGE: { SCC: 0, PAC: 0, MEGARAM: 0 } }, SCC: { URL: "@[SCCExpansion].rom", SLOT: [1], SLOT2: [2], CHANGE: { SCCI: 0, PAC: 0, MEGARAM: 0 } }, PAC: { DESC: "PAC SRAM", URL: "@[PACExpansion].rom", SLOT: [1], SLOT2: [2], CHANGE: { SCCI: 0, SCC: 0, MEGARAM: 0 } }, MEGARAM: { DESC: "MegaRAM", URL: "@[MegaRAM].rom", SLOT: [1], SLOT2: [2], CHANGE: { SCCI: 0, SCC: 0, PAC: 0 } } }; WMSX.PRESETS_CONFIG = { // Extensions Options Presets. Must be specified in this order // Hard Disk: Nextor Removable Device HARDDISK: { "EXTENSIONS.HARDDISK": 1 }, HARDDISKC: { "EXTENSIONS.HARDDISK": 2 }, DOS2: { "EXTENSIONS.HARDDISK": 1 }, NOHARDDISK: { "EXTENSIONS.HARDDISK": 0 }, // Floppy Disk Drives DISK: { "EXTENSIONS.DISK": 2 }, DISKA: { "EXTENSIONS.DISK": 1 }, NODISK: { "EXTENSIONS.DISK": 0 }, // RAM type RAMMAPPER: { "EXTENSIONS.RAMMAPPER": 1 }, RAMNORMAL: { "EXTENSIONS.RAMMAPPER": 0 }, // Japanese character support KANJI: { "EXTENSIONS.KANJI": 1 }, NOKANJI: { "EXTENSIONS.KANJI": 0 }, NOMSXJE: { "EXTENSIONS_CONFIG.MSXJE.URL": "" }, // V9990 Video V9990: { "EXTENSIONS.V9990": 1 }, // Sound Devices MSXMUSIC: { "EXTENSIONS.MSXMUSIC": 1 }, NOMSXMUSIC: { "EXTENSIONS.MSXMUSIC": 0 }, DOUBLEPSG: { "EXTENSIONS.DOUBLEPSG": 1 }, OPL4: { "EXTENSIONS.OPL4": 1 }, // Other Cartridge extensions SCCI: { "EXTENSIONS.SCCI": 1 }, SCCI2: { "EXTENSIONS.SCCI": 2 }, SCC: { "EXTENSIONS.SCC": 1 }, SCC2: { "EXTENSIONS.SCC": 2 }, PAC: { "EXTENSIONS.PAC": 1 }, PAC2: { "EXTENSIONS.PAC": 2 }, MEGARAM: { "EXTENSIONS.MEGARAM": 1 }, MEGARAM2: { "EXTENSIONS.MEGARAM": 2 }, // Configuration Helper Presets RAM128: { _INCLUDE: "RAMMAPPER", RAMMAPPER_SIZE: 128 }, RAM256: { _INCLUDE: "RAMMAPPER", RAMMAPPER_SIZE: 256 }, RAM512: { _INCLUDE: "RAMMAPPER", RAMMAPPER_SIZE: 512 }, RAM1024: { _INCLUDE: "RAMMAPPER", RAMMAPPER_SIZE: 1024 }, RAM2048: { _INCLUDE: "RAMMAPPER", RAMMAPPER_SIZE: 2048 }, RAM4096: { _INCLUDE: "RAMMAPPER", RAMMAPPER_SIZE: 4096 }, NORAMMAPPER: { _INCLUDE: "RAMNORMAL"}, MEGARAM256: { _INCLUDE: "MEGARAM", MEGARAM_SIZE: 256 }, MEGARAM512: { _INCLUDE: "MEGARAM", MEGARAM_SIZE: 512 }, MEGARAM1024: { _INCLUDE: "MEGARAM", MEGARAM_SIZE: 1024 }, MEGARAM2048: { _INCLUDE: "MEGARAM", MEGARAM_SIZE: 2048 }, VSYNCDISABLED: { SCREEN_VSYNC_MODE: -1 }, VSYNCOFF: { SCREEN_VSYNC_MODE: 0 }, VSYNCON: { SCREEN_VSYNC_MODE: 1 }, PSGSTEREO: { PSG_PAN: "4c8" }, PSGSTEREO2: { PSG_PAN: "8c4" }, SCCSTEREO: { SCC_PAN: "8c4c4" }, SCCSTEREO2: { PSG_PAN: "4c4c8" }, OPLLSTEREO: { OPLL_PAN: "4c4c4c4c488888" }, ALLSTEREO: { _INCLUDE: "PSGSTEREO, SCCSTEREO, OPLLSTEREO" }, ALLSTEREO2: { _INCLUDE: "PSGSTEREO2, SCCSTEREO2, OPLLSTEREO" }, // Boosted Machine Preset BOOSTED: { Z80_CLOCK_MODE: 3, VDP_CLOCK_MODE: 3, BOOT_DURATION_AUTO: 165, _INCLUDE: "HARDDISK" }, // Special Machine-defined modifications to Extensions DISKEXTN: { "EXTENSIONS_CONFIG.DISK.URL": "@[DiskPatch].rom" }, DISKEXTTR: { "EXTENSIONS_CONFIG.DISK.URL": "@[DiskPatchDOS2TR].rom" }, MSXMUSEXTN: { "EXTENSIONS_CONFIG.MSXMUSIC.URL": "@[MSXMUSIC].rom", "EXTENSIONS_CONFIG.MSXMUSIC.SLOT": [3, 3], "EXTENSIONS_CONFIG.MSXMUSICX.SLOT": [0, 2] }, MSXMUSEXTTR: { "EXTENSIONS_CONFIG.MSXMUSIC.URL": "@[MSXMUSIC]TR.rom", "EXTENSIONS_CONFIG.MSXMUSIC.SLOT": [0, 2], "EXTENSIONS_CONFIG.MSXMUSICX.SLOT": [3, 3] }, KANJIDRVN: { "EXTENSIONS_CONFIG.KANJI.BOUND": [ "KANJIDRV", "MSXJE" ] }, KANJIDRVP: { "EXTENSIONS_CONFIG.KANJI.BOUND": [ "MSXJE" ], "EXTENSIONS.KANJIDRV": 0 }, RAMN: { "RAMMAPPER_SIZE": 512 }, RAMTR: { "RAMMAPPER_SIZE": 1024 }, // Alternate Slot Configuration: try to keep RAM alone on primary Slot 3 ALTSLOTCONFIG: { EXPANSION1_SLOT: [3, 2], EXPANSION2_SLOT: [3, 3], "PRESETS_CONFIG.DISK": { "EXTENSIONS.DISK": 1 }, "PRESETS_CONFIG.MSXMUSEXTN": { "EXTENSIONS_CONFIG.MSXMUSIC.URL": "@[MSXMUSIC].rom", "EXTENSIONS_CONFIG.MSXMUSIC.SLOT": [2, 2], "EXTENSIONS_CONFIG.MSXMUSICX.SLOT": [0, 2] }, "PRESETS_CONFIG.MSXMUSEXTTR": { "EXTENSIONS_CONFIG.MSXMUSIC.URL": "@[MSXMUSIC]TR.rom", "EXTENSIONS_CONFIG.MSXMUSIC.SLOT": [0, 2], "EXTENSIONS_CONFIG.MSXMUSICX.SLOT": [2, 2] }, "EXTENSIONS_CONFIG.KANJIDRV.SLOT": [2, 1], "EXTENSIONS_CONFIG.MSXJE.SLOT": [3, 3] }, // MSX2 tR Machine Presets. Do not use directly _MSXTRA: { _INCLUDE: "_MSXTRBASE", SLOT00_URL: "@MSXTR_NTSC.bios", SLOT03_URL: "@MSXTROPEN_NTSC.bios", SLOT03_FORMAT: "PlainROM", SLOT03_START: "0x4000", SLOT31_URL: "@MSXTREXT_NTSC.bios | @KanjiBasicOnly.bios", BOOT_DURATION_AUTO: 380 }, _MSXTRE: { _INCLUDE: "_MSXTRBASE", SLOT00_URL: "@MSXTR_PAL.bios", SLOT03_URL: "@MSXTROPEN_PAL.bios", SLOT03_FORMAT: "PlainROM", SLOT03_START: "0x4000", SLOT31_URL: "@MSXTREXT_PAL.bios | @KanjiBasicOnly.bios", BOOT_DURATION_AUTO: 380 }, _MSXTRJ: { _INCLUDE: "_MSXTRBASE, KANJI", SLOT00_URL: "@MSXTR_JAP.bios", SLOT03_URL: "@MSXTROPEN_NTSC.bios", SLOT03_FORMAT: "PlainROM", SLOT03_START: "0x4000", SLOT31_URL: "@MSXTREXT_JAP.bios | @KanjiBasicOnly.bios", BOOT_DURATION_AUTO: 380 }, _MSXTRBASE: { _INCLUDE: "_MSX2BASE, DISKEXTTR, MSXMUSEXTTR, KANJIDRVP, RAMTR" }, // MSX2+ Machine Presets. Do not use directly _MSX2PA: { _INCLUDE: "_MSX2PBASE", SLOT0P_URL: "@MSX2P_NTSC.bios", SLOT31_URL: "@MSX2PEXT_NTSC.bios | @KanjiBasic2PLogo_NTSC.bios", BOOT_DURATION_AUTO: 380 }, _MSX2PE: { _INCLUDE: "_MSX2PBASE", SLOT0P_URL: "@MSX2P_PAL.bios", SLOT31_URL: "@MSX2PEXT_PAL.bios | @KanjiBasic2PLogo_PAL.bios", BOOT_DURATION_AUTO: 395 }, _MSX2PJ: { _INCLUDE: "_MSX2PBASE, KANJI", SLOT0P_URL: "@MSX2P_JAP.bios", SLOT31_URL: "@MSX2PEXT_JAP.bios | @KanjiBasic2PLogo_NTSC.bios", BOOT_DURATION_AUTO: 380 }, _MSX2PBASE: { _INCLUDE: "_MSX2BASE, KANJIDRVP" }, // MSX2 Machine Presets. Do not use directly _MSX2A: { _INCLUDE: "_MSX2BASE", SLOT0P_URL: "@MSX2_NTSC.bios", SLOT31_URL: "@MSX2EXT_NTSC.bios", BOOT_DURATION_AUTO: 385 }, _MSX2E: { _INCLUDE: "_MSX2BASE", SLOT0P_URL: "@MSX2_PAL.bios", SLOT31_URL: "@MSX2EXT_PAL.bios", BOOT_DURATION_AUTO: 400 }, _MSX2J: { _INCLUDE: "_MSX2BASE, KANJI", SLOT0P_URL: "@MSX2_JAP.bios", SLOT31_URL: "@MSX2EXT_JAP.bios", BOOT_DURATION_AUTO: 360 }, _MSX2BASE: { _INCLUDE: "_BASE, RAMMAPPER, DISK, MSXMUSIC, NOKANJI" }, // MSX1 Machine Presets. Do not use directly _MSX1A: { _INCLUDE: "_MSX1BASE", SLOT0P_URL: "@MSX1_NTSC.bios", BOOT_DURATION_AUTO: 375 }, _MSX1E: { _INCLUDE: "_MSX1BASE", SLOT0P_URL: "@MSX1_PAL.bios", BOOT_DURATION_AUTO: 375 }, _MSX1J: { _INCLUDE: "_MSX1BASE", SLOT0P_URL: "@MSX1_JAP.bios", BOOT_DURATION_AUTO: 230 }, _MSX1BASE: { _INCLUDE: "_BASE, RAMNORMAL, DISK, NOHARDDISK, NOMSXMUSIC, NOKANJI", SLOT31_URL : "" // MSX1 has no BIOS Extension on slot 3-1, clear }, // Base Machines Presets. Do not use directly _EMPTY: { _INCLUDE: "_BASE", EXTENSIONS: { }, SLOT0P_URL: "", SLOT1P_URL: "", SLOT2P_URL: "", SLOT3P_URL: "", SLOT4P_URL: "" // Special Device I/O only slot }, _BASE: { _INCLUDE: "DISKEXTN, MSXMUSEXTN, KANJIDRVN, RAMN" } }; WMSX.params = {}; // Additional parameter overrides wmsx = window.wmsx || {}; // Namespace function onUpdateReady(){alert("A new version is available!\nWebMSX will restart..."),window.applicationCache.swapCache(),window.location.reload()}WMSXFullScreenSetup={apply:function(){if(!this.cssApplied){var a=document.createElement("style");a.type="text/css",a.innerHTML=this.css,document.head.appendChild(a),this.cssApplied=!0}document.documentElement.classList.toggle("wmsx-full-screen",this.shouldStartInFullScreen())},shouldStartInFullScreen:function(){return window.WMSX?WMSX.SCREEN_FULLSCREEN_MODE>=1||-1===WMSX.SCREEN_FULLSCREEN_MODE&&this.isBrowserStandaloneMode():this.isBrowserStandaloneMode()},isBrowserStandaloneMode:function(){return navigator.standalone||window.matchMedia("(display-mode: standalone)").matches},css:"html.wmsx-full-screen, html.wmsx-full-screen body { background: black;}html.wmsx-full-screen .wmsx-full-screen-hidden { display: none;}html:not(.wmsx-full-screen) .wmsx-full-screen-only { display: none;}"},WMSXFullScreenSetup.apply(),wmsx.Util=new function(){"use strict";function a(a,b){return a.nameb.name?1:0}function b(a){return a.stopPropagation(),a.cancelable&&a.preventDefault(),!1}this.log=function(a){var b=[">> wmsx:"];Array.prototype.push.apply(b,arguments),console.log.apply(console,b)},this.warning=function(a){var b=[">> wmsx Warning:"];Array.prototype.push.apply(b,arguments),console.warn.apply(console,b)},this.error=function(a){var b=[">> wmsx Error:"];Array.prototype.push.apply(b,arguments),console.error.apply(console,b)},this.message=function(a){console.info(a),alert(a)},this.asNormalArray=function(a,b,c){return!c&&a instanceof Array?a:c?this.arrayCopy(a,b,new Array(c)):this.arrayCopy(a,0,new Array(a.length))},this.arrayFill=function(a,b,c,d){if(a.fill)return a.fill(b,c,d);void 0===c&&(c=0);for(var e=(void 0===d?a.length:d)-1;e>=c;e-=1)a[e]=b;return a},this.arrayCopy=function(a,b,c,d,e){d=d||0;for(var f=e?b+e:a.length;b=0;)a.splice(c,1);return a},this.arraysConcatAll=function(a){for(var b=0,c=0;c>8&255);return d},this.byteStringToInt16BitArray=function(a,b){if(null===a||void 0===a)return a;if("null"==a)return null;if("undefined"!=a){for(var c=a.length/2|0,d=b&&b.length===c?b:new(b?b.constructor:Array)(c),e=0,f=0;e>8&255)+String.fromCharCode(a[e]>>16&255)+String.fromCharCode(a[e]>>24&255);return d},this.byteStringToInt32BitArray=function(a,b){if(null===a||void 0===a)return a;if("null"==a)return null;if("undefined"!=a){for(var c=a.length/4|0,d=b&&b.length===c?b:new(b?b.constructor:Array)(c),e=0,f=0;e=0&&b.length%2?"0"+b:b},this.toHex4=function(a){return this.toHexN(a,4)},this.toHexN=function(a,b){if(null===a||void 0===a)return a;var c=a.toString(16);return a<0?c:(b>=0||(b=2),"00000000".substr(0,b-c.length)+c)},this.escapeHtml=function(a){return a.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/").replace(/\?/g,"?").replace(/\-/g,"-").replace(/\|/g,"|")},this.arrayFind=function(a,b){if(a.find)return a.find(b);for(var c=0,d=a.length;c=0&&h=0;--c){var d=b[c].trim();if(d)return d}return""},this.leafFilenameNoExtension=function(a){var b=this.leafFilename(a),c=b.lastIndexOf(".");return c<=0?b:b.substr(0,c).trim()},this.leafFilenameOnlyExtension=function(a){var b=this.leafFilename(a),c=b.lastIndexOf(".");return c<=0?"":b.substr(c+1).trim()},this.dump=function(a,b,c,d){var e="",f=b||0;d=d||a.length,c=c||d;for(var g=0;g0||"ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0},this.isMobileDevice=function(){return WMSX.MOBILE_MODE>0||0===WMSX.MOBILE_MODE&&this.isTouchDevice()&&(/android|blackberry|iemobile|windows mobile|ipad|iphone|ipod|opera mini|webos/i.test(navigator.userAgent)||navigator.maxTouchPoints>1&&void 0!==window.orientation&&null!==window.orientation)},this.isIOSDevice=function(){return/ipad|iphone|ipod/i.test(navigator.userAgent)},this.isAndroidDevice=function(){return/android/i.test(navigator.userAgent)},this.isBrowserStandaloneMode=function(){return navigator.standalone||window.matchMedia("(display-mode: standalone)").matches},this.onTapOrMouseDown=function(a,b){this.addEventsListener(a,this.isTouchDevice()?"touchstart mousedown":"mousedown",b)},this.onTapOrMouseDownWithBlock=function(a,c){function d(a){return c(a),b(a)}this.addEventsListener(a,this.isTouchDevice()?"touchstart mousedown":"mousedown",d)},this.onTapOrMouseUpWithBlock=function(a,c){function d(a){return c(a),b(a)}this.addEventsListener(a,this.isTouchDevice()?"touchstart mouseup":"mouseup",d)},this.onTapOrMouseDownWithBlockUIG=function(a,c){function d(a){if("touchend"===a.type&&!a.target.wmsxNeedsUIG)return b(a);var d="touchstart"===a.type&&a.target.wmsxNeedsUIG,e="touchend"===a.type;return c(a,d,e),b(a)}this.addEventsListener(a,this.isTouchDevice()?"touchstart touchend mousedown":"mousedown",d)},this.blockEvent=b,this.addEventsListener=function(a,b,c,d){b=b.split(" ");for(var e=0;e=0;c--)b+=this.hex_chr.charAt(a>>4*c&15);return b},str2blks_SHA1:function(a){for(var b=1+(a.length+8>>6),c=new Array(16*b),d=0;d<16*b;d++)c[d]=0;for(d=0;d>2]|=a.charCodeAt(d)<<24-d%4*8;return c[d>>2]|=128<<24-d%4*8,c[16*b-1]=8*a.length,c},add:function(a,b){var c=(65535&a)+(65535&b);return(a>>16)+(b>>16)+(c>>16)<<16|65535&c},rol:function(a,b){return a<>>32-b},ft:function(a,b,c,d){return a<20?b&c|~b&d:a<40?b^c^d:a<60?b&c|b&d|c&d:b^c^d},kt:function(a){return a<20?1518500249:a<40?1859775393:a<60?-1894007588:-899497514},calcSHA1FromByteArray:function(a){for(var b="",c=0;c>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|e>>6,i=63&e,isNaN(c)?h=i=64:isNaN(e)&&(i=64),j=j+d.charAt(f)+d.charAt(g)+d.charAt(h)+d.charAt(i);return j},c.decode=function(a){var b,c,e,f,g,h,i,j="",k=0 ;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");k>4,c=(15&g)<<4|h>>2,e=(3&h)<<6|i,j+=String.fromCharCode(b),64!=h&&(j+=String.fromCharCode(c)),64!=i&&(j+=String.fromCharCode(e));return j}},{}],2:[function(a,b){"use strict";function c(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}c.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=c},{}],3:[function(a,b,c){"use strict";c.STORE={magic:"\0\0",compress:function(a){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a("./flate")},{"./flate":8}],4:[function(a,b){"use strict";var c=a("./utils"),d=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(a,b){if(void 0===a||!a.length)return 0;var e="string"!==c.getTypeOf(a);void 0===b&&(b=0);var f=0,g=0,h=0;b^=-1;for(var i=0,j=a.length;j>i;i++)h=e?a[i]:a.charCodeAt(i),g=255&(b^h),f=d[g],b=b>>>8^f;return-1^b}},{"./utils":21}],5:[function(a,b){"use strict";function c(){this.data=null,this.length=0,this.index=0}var d=a("./utils");c.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.lengtha)throw new Error("End of data reached (data length = "+this.length+", asked index = "+a+"). Corrupted zip ?")},setIndex:function(a){this.checkIndex(a),this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(){},readInt:function(a){var b,c=0;for(this.checkOffset(a),b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return d.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date(1980+(a>>25&127),(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1)}},b.exports=c},{"./utils":21}],6:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!1,c.date=null,c.compression=null,c.comment=null},{}],7:[function(a,b,c){"use strict";var d=a("./utils");c.string2binary=function(a){return d.string2binary(a)},c.string2Uint8Array=function(a){return d.transformTo("uint8array",a)},c.uint8Array2String=function(a){return d.transformTo("string",a)},c.string2Blob=function(a){var b=d.transformTo("arraybuffer",a);return d.arrayBuffer2Blob(b)},c.arrayBuffer2Blob=function(a){return d.arrayBuffer2Blob(a)},c.transformTo=function(a,b){return d.transformTo(a,b)},c.getTypeOf=function(a){return d.getTypeOf(a)},c.checkSupport=function(a){return d.checkSupport(a)},c.MAX_VALUE_16BITS=d.MAX_VALUE_16BITS,c.MAX_VALUE_32BITS=d.MAX_VALUE_32BITS,c.pretty=function(a){return d.pretty(a)},c.findCompression=function(a){return d.findCompression(a)},c.isRegExp=function(a){return d.isRegExp(a)}},{"./utils":21}],8:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,e=a("pako");c.uncompressInputType=d?"uint8array":"array",c.compressInputType=d?"uint8array":"array",c.magic="\b\0",c.compress=function(a){return e.deflateRaw(a)},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:24}],9:[function(a,b){"use strict";function c(a,b){return this instanceof c?(this.files={},this.comment=null,this.root="",a&&this.load(a,b),void(this.clone=function(){var a=new c;for(var b in this)"function"!=typeof this[b]&&(a[b]=this[b]);return a})):new c(a,b)}var d=a("./base64");c.prototype=a("./object"),c.prototype.load=a("./load"),c.support=a("./support"),c.defaults=a("./defaults"),c.utils=a("./deprecatedPublicUtils"),c.base64={encode:function(a){return d.encode(a)},decode:function(a){return d.decode(a)}},c.compressions=a("./compressions"),b.exports=c},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(a,b){"use strict";var c=a("./base64"),d=a("./zipEntries");b.exports=function(a,b){var e,f,g,h;for(b=b||{},b.base64&&(a=c.decode(a)),f=new d(a,b),e=f.files,g=0;gc;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},t=function(){var a,b,c={};for(a=0;a0?a.substring(0,b):""},x=function(a,b){return"/"!=a.slice(-1)&&(a+="/"),b=void 0!==b&&b,this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},y=function(a,b){var c,f=new j;return a._data instanceof j?(f.uncompressedSize=a._data.uncompressedSize,f.crc32=a._data.crc32,0===f.uncompressedSize||a.dir?(b=i.STORE,f.compressedContent="",f.crc32=0):a._data.compressionMethod===b.magic?f.compressedContent=a._data.getCompressedContent():(c=a._data.getContent(),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c)))):(c=p(a),(!c||0===c.length||a.dir)&&(b=i.STORE,c=""),f.uncompressedSize=c.length,f.crc32=e(c),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c))),f.compressedSize=f.compressedContent.length,f.compressionMethod=b.magic,f},z=function(a,b,c,g){var h,i,j,k,m=(c.compressedContent,d.transformTo("string",l.utf8encode(b.name))),n=b.comment||"",o=d.transformTo("string",l.utf8encode(n)),p=m.length!==b.name.length,q=o.length!==n.length,r=b.options,t="",u="",v="";j=b._initialMetadata.dir!==b.dir?b.dir:r.dir,k=b._initialMetadata.date!==b.date?b.date:r.date,h=k.getHours(),h<<=6,h|=k.getMinutes(),h<<=5,h|=k.getSeconds()/2,i=k.getFullYear()-1980,i<<=4,i|=k.getMonth()+1,i<<=5,i|=k.getDate(),p&&(u=s(1,1)+s(e(m),4)+m,t+="up"+s(u.length,2)+u),q&&(v=s(1,1)+s(this.crc32(o),4)+o,t+="uc"+s(v.length,2)+v);var w="";return w+="\n\0",w+=p||q?"\0\b":"\0\0",w+=c.compressionMethod,w+=s(h,2),w+=s(i,2),w+=s(c.crc32,4),w+=s(c.compressedSize,4),w+=s(c.uncompressedSize,4),w+=s(m.length,2),w+=s(t.length,2),{fileRecord:f.LOCAL_FILE_HEADER+w+m+t,dirRecord:f.CENTRAL_FILE_HEADER+"\0"+w+s(o.length,2)+"\0\0\0\0"+(!0===j?"\0\0\0":"\0\0\0\0")+s(g,4)+m+t+o,compressedObject:c}},A={load:function(){throw new Error("Load method is not defined. Is the file jszip-load.js included ?")},filter:function(a){var b,c,d,e,f=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],e=new r(d.name,d._data,t(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,e)&&f.push(e));return f},file:function(a,b,c){if(1===arguments.length){if(d.isRegExp(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,v.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=x.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!=a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f;return-1},c.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5}],19:[function(a,b){"use strict";var c=a("./utils"),d=function(a){this.data=new Uint8Array(a),this.index=0};d.prototype={append:function(a){0!==a.length&&(a=c.transformTo("uint8array",a),this.data.set(a,this.index),this.index+=a.length)},finalize:function(){return this.data}},b.exports=d},{"./utils":21}],20:[function(a,b,c){"use strict";for(var d=a("./utils"),e=a("./support"),f=a("./nodeBuffer"),g=new Array(256),h=0;256>h;h++)g[h]=h>=252?6:h>=248?5:h>=240?4:h>=224?3:h>=192?2:1;g[254]=g[254]=1;var i=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296==(64512&c)&&h>f+1&&56320==(64512&(d=a.charCodeAt(f+1)))&&(c=65536+(c-55296<<10)+(d-56320),f++),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=e.uint8array?new Uint8Array(i):new Array(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296==(64512&c)&&h>f+1&&56320==(64512&(d=a.charCodeAt(f+1)))&&(c=65536+(c-55296<<10)+(d-56320),f++),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},j=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128==(192&a[c]);)c--;return 0>c?b:0===c?b:c+g[a[c]]>b?c:b},k=function(a){var b,c,e,f,h=a.length,i=new Array(2*h);for(c=0,b=0;h>b;)if(128>(e=a[b++]))i[c++]=e;else if((f=g[e])>4)i[c++]=65533,b+=f-1;else{for(e&=2===f?31:3===f?15:7;f>1&&h>b;)e=e<<6|63&a[b++],f--;f>1?i[c++]=65533:65536>e?i[c++]=e:(e-=65536,i[c++]=55296|e>>10&1023,i[c++]=56320|1023&e)}return i.length!==c&&(i.subarray?i=i.subarray(0,c):i.length=c),d.applyFromCharCode(i)};c.utf8encode=function(a){return e.nodebuffer?f(a,"utf-8"):i(a)},c.utf8decode=function(a){if(e.nodebuffer)return d.transformTo("nodebuffer",a).toString("utf-8");a=d.transformTo(e.uint8array?"uint8array":"array",a);for(var b=[],c=0,f=a.length;f>c;){var g=j(a,Math.min(c+65536,f));b.push(k(e.uint8array?a.subarray(c,g):a.slice(c,g))),c=g}return b.join("")}},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(a,b,c){"use strict";function d(a){return a}function e(a,b){for(var c=0;cg&&b>1;)try{d.push("array"===f||"nodebuffer"===f?String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e))):String.fromCharCode.apply(null,a.subarray(g,Math.min(g+b,e)))),g+=b}catch(a){b=Math.floor(b/2)}return d.join("")}function g(a,b){for(var c=0;cb?"0":"")+b.toString(16).toUpperCase();return d},c.findCompression=function(a){for(var b in i)if(i.hasOwnProperty(b)&&i[b].magic===a)return i[b];return null},c.isRegExp=function(a){return"[object RegExp]"===Object.prototype.toString.call(a)}},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(a,b){"use strict";function c(a,b){this.files=[],this.loadOptions=b,a&&this.load(a)}var d=a("./stringReader"),e=a("./nodeBufferReader"),f=a("./uint8ArrayReader"),g=a("./utils"),h=a("./signature"),i=a("./zipEntry"),j=a("./support"),k=a("./object");c.prototype={checkSignature:function(a){var b=this.reader.readString(4);if(b!==a)throw new Error("Corrupted zip or bug : unexpected signature ("+g.pretty(b)+", expected "+g.pretty(a)+")")},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2),this.zipComment=this.reader.readString(this.zipCommentLength),this.zipComment=k.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.versionMadeBy=this.reader.readString(2),this.versionNeeded=this.reader.readInt(2),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var a,b,c,d=this.zip64EndOfCentralSize-44;d>0;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readString(b),this.zip64ExtensibleData[a]={id:a,length:b,value:c}}, readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;a0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=g.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(0!==c)throw new Error(j[c]);b.header&&g.deflateSetHeader(this.strm,b.header)};l.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:!0===b?4:0,e.input="string"==typeof a?i.string2buf(a):a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new h.Buf8(f),e.next_out=0,e.avail_out=f),1!==(c=g.deflate(e,d))&&0!==c)return this.onEnd(c),this.ended=!0,!1;(0===e.avail_out||0===e.avail_in&&4===d)&&this.onData("string"===this.options.to?i.buf2binstring(h.shrinkBuf(e.output,e.next_out)):h.shrinkBuf(e.output,e.next_out))}while((e.avail_in>0||0===e.avail_out)&&1!==c) ;return 4!==d||(c=g.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,0===c)},l.prototype.onData=function(a){this.chunks.push(a)},l.prototype.onEnd=function(a){0===a&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=l,c.deflate=d,c.deflateRaw=e,c.gzip=f},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(a,b,c){"use strict";function d(a,b){var c=new m(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}var f=a("./zlib/inflate.js"),g=a("./utils/common"),h=a("./utils/strings"),i=a("./zlib/constants"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=a("./zlib/gzheader"),m=function(a){this.options=g.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0==(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=f.inflateInit2(this.strm,b.windowBits);if(c!==i.Z_OK)throw new Error(j[c]);this.header=new l,f.inflateGetHeader(this.strm,this.header)};m.prototype.push=function(a,b){var c,d,e,j,k,l=this.strm,m=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:!0===b?i.Z_FINISH:i.Z_NO_FLUSH,l.input="string"==typeof a?h.binstring2buf(a):a,l.next_in=0,l.avail_in=l.input.length;do{if(0===l.avail_out&&(l.output=new g.Buf8(m),l.next_out=0,l.avail_out=m),(c=f.inflate(l,i.Z_NO_FLUSH))!==i.Z_STREAM_END&&c!==i.Z_OK)return this.onEnd(c),this.ended=!0,!1;l.next_out&&(0===l.avail_out||c===i.Z_STREAM_END||0===l.avail_in&&d===i.Z_FINISH)&&("string"===this.options.to?(e=h.utf8border(l.output,l.next_out),j=l.next_out-e,k=h.buf2string(l.output,e),l.next_out=j,l.avail_out=m-j,j&&g.arraySet(l.output,l.output,e,j,0),this.onData(k)):this.onData(g.shrinkBuf(l.output,l.next_out)))}while(l.avail_in>0&&c!==i.Z_STREAM_END);return c===i.Z_STREAM_END&&(d=i.Z_FINISH),d!==i.Z_FINISH||(c=f.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===i.Z_OK)},m.prototype.onData=function(a){this.chunks.push(a)},m.prototype.onEnd=function(a){a===i.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):g.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=m,c.inflate=d,c.inflateRaw=e,c.ungzip=d},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){var b,c,d,e,f,g;for(d=0,b=0,c=a.length;c>b;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;c>b;b++)f=a[b],g.set(f,e),e+=f.length;return g}},f={arraySet:function(a,b,c,d,e){for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){return[].concat.apply([],a)}};c.setTyped=function(a){a?(c.Buf8=Uint8Array,c.Buf16=Uint16Array,c.Buf32=Int32Array,c.assign(c,e)):(c.Buf8=Array,c.Buf16=Array,c.Buf32=Array,c.assign(c,f))},c.setTyped(d)},{}],28:[function(a,b,c){"use strict";function d(a,b){if(65537>b&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c="",d=0;b>d;d++)c+=String.fromCharCode(a[d]);return c}var e=a("./common"),f=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(a){f=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(a){g=!1}for(var h=new e.Buf8(256),i=0;256>i;i++)h[i]=i>=252?6:i>=248?5:i>=240?4:i>=224?3:i>=192?2:1;h[254]=h[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296==(64512&c)&&h>f+1&&56320==(64512&(d=a.charCodeAt(f+1)))&&(c=65536+(c-55296<<10)+(d-56320),f++),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=new e.Buf8(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296==(64512&c)&&h>f+1&&56320==(64512&(d=a.charCodeAt(f+1)))&&(c=65536+(c-55296<<10)+(d-56320),f++),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;d>c;c++)b[c]=a.charCodeAt(c);return b},c.buf2string=function(a,b){var c,e,f,g,i=b||a.length,j=new Array(2*i);for(e=0,c=0;i>c;)if(128>(f=a[c++]))j[e++]=f;else if((g=h[f])>4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&i>c;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:65536>f?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128==(192&a[c]);)c--;return 0>c?b:0===c?b:c+h[a[c]]>b?c:b}},{"./common":27}],29:[function(a,b){"use strict";function c(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do{e=e+b[d++]|0,f=f+e|0}while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=c},{}],30:[function(a,b){b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(a,b){"use strict";function c(a,b,c,e){var f=d,g=e+c;a^=-1;for(var h=e;g>h;h++)a=a>>>8^f[255&(a^b[h])];return-1^a}var d=function(){for(var a,b=[],c=0;256>c;c++){a=c;for(var d=0;8>d;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}();b.exports=c},{}],32:[function(a,b,c){"use strict";function d(a,b){return a.msg=G[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(C.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){D._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,C.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=E(a.adler,b,e,c):2===a.state.wrap&&(a.adler=F(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-ha?a.strstart-(a.w_size-ha):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ga,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do{if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do{}while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&m>f);if(d=ga-(m-f),f=m-ga,d>g){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}}while((b=l[b&k])>i&&0!=--e) ;return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-ha)){C.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do{d=a.head[--b],a.head[b]=d>=g?d-g:0}while(--c);c=g,b=c;do{d=a.prev[--b],a.prev[b]=d>=g?d-g:0}while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=fa)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===H)return qa;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return qa;if(a.strstart-a.block_start>=a.w_size-ha&&(h(a,!1),0===a.strm.avail_out))return qa}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?sa:ta):(a.strstart>a.block_start&&(h(a,!1),a.strm.avail_out),qa)}function o(a,b){for(var c,d;;){if(a.lookahead=fa&&(a.ins_h=(a.ins_h<=fa)if(d=D._tr_tally(a,a.strstart-a.match_start,a.match_length-fa),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=fa){a.match_length--;do{a.strstart++,a.ins_h=(a.ins_h<=fa&&(a.ins_h=(a.ins_h<4096)&&(a.match_length=fa-1)),a.prev_length>=fa&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-fa,d=D._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-fa),a.lookahead-=a.prev_length-1,a.prev_length-=2;do{++a.strstart<=e&&(a.ins_h=(a.ins_h<=fa&&a.strstart>0&&(e=a.strstart-1,(d=g[e])===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ga;do{}while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&f>e);a.match_length=ga-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=fa?(c=D._tr_tally(a,1,a.match_length-fa),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return qa}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?sa:ta):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?qa:ra}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===H)return qa;break}if(a.match_length=0,c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return qa}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?sa:ta):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?qa:ra}function s(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=B[a.level].max_lazy,a.good_match=B[a.level].good_length,a.nice_match=B[a.level].nice_length,a.max_chain_length=B[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=fa-1,a.match_available=0,a.ins_h=0}function t(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Y,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new C.Buf16(2*da),this.dyn_dtree=new C.Buf16(2*(2*ba+1)),this.bl_tree=new C.Buf16(2*(2*ca+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new C.Buf16(ea+1),this.heap=new C.Buf16(2*aa+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new C.Buf16(2*aa+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function u(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=X,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?ja:oa,a.adler=2===b.wrap?0:1,b.last_flush=H,D._tr_init(b),M):d(a,O)}function v(a){var b=u(a);return b===M&&s(a.state),b}function w(a,b){return a&&a.state?2!==a.state.wrap?O:(a.state.gzhead=b,M):O}function x(a,b,c,e,f,g){if(!a)return O;var h=1;if(b===R&&(b=6),0>e?(h=0,e=-e):e>15&&(h=2,e-=16),1>f||f>Z||c!==Y||8>e||e>15||0>b||b>9||0>g||g>V)return d(a,O);8===e&&(e=9);var i=new t;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<>1,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,v(a)}function y(a,b){return x(a,b,Y,$,_,W)}function z(a,b){var c,h,k,l;if(!a||!a.state||b>L||0>b)return a?d(a,O):O;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===pa&&b!==K)return d(a,0===a.avail_out?Q:O);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===ja)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8), h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=F(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=ka):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,ua),h.status=oa);else{var m=Y+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=T||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=ia),m+=31-m%31,h.status=oa,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===ka)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=la)}else h.status=la;if(h.status===la)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=ma)}else h.status=ma;if(h.status===ma)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=na)}else h.status=na;if(h.status===na&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=oa)):h.status=oa),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,M}else if(0===a.avail_in&&e(b)<=e(c)&&b!==K)return d(a,Q);if(h.status===pa&&0!==a.avail_in)return d(a,Q);if(0!==a.avail_in||0!==h.lookahead||b!==H&&h.status!==pa){var o=h.strategy===T?r(h,b):h.strategy===U?q(h,b):B[h.level].func(h,b);if((o===sa||o===ta)&&(h.status=pa),o===qa||o===sa)return 0===a.avail_out&&(h.last_flush=-1),M;if(o===ra&&(b===I?D._tr_align(h):b!==L&&(D._tr_stored_block(h,0,0,!1),b===J&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,M}return b!==K?M:h.wrap<=0?N:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?M:N)}function A(a){var b;return a&&a.state?(b=a.state.status,b!==ja&&b!==ka&&b!==la&&b!==ma&&b!==na&&b!==oa&&b!==pa?d(a,O):(a.state=null,b===oa?d(a,P):M)):O}var B,C=a("../utils/common"),D=a("./trees"),E=a("./adler32"),F=a("./crc32"),G=a("./messages"),H=0,I=1,J=3,K=4,L=5,M=0,N=1,O=-2,P=-3,Q=-5,R=-1,S=1,T=2,U=3,V=4,W=0,X=2,Y=8,Z=9,$=15,_=8,aa=286,ba=30,ca=19,da=2*aa+1,ea=15,fa=3,ga=258,ha=ga+fa+1,ia=32,ja=42,ka=69,la=73,ma=91,na=103,oa=113,pa=666,qa=1,ra=2,sa=3,ta=4,ua=3,va=function(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e};B=[new va(0,0,0,0,n),new va(4,4,8,4,o),new va(4,5,16,8,o),new va(4,6,32,32,o),new va(4,4,16,16,p),new va(8,16,32,32,p),new va(8,16,128,128,p),new va(8,32,128,256,p),new va(32,128,258,1024,p),new va(32,258,258,4096,p)],c.deflateInit=y,c.deflateInit2=x,c.deflateReset=v,c.deflateResetKeep=u,c.deflateSetHeader=w,c.deflate=z,c.deflateEnd=A,c.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(a,b){"use strict";function c(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}b.exports=c},{}],34:[function(a,b){"use strict";b.exports=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A;c=a.state,d=a.next_in,z=a.input,e=d+(a.avail_in-5),f=a.next_out,A=a.output,g=f-(b-a.avail_out),h=f+(a.avail_out-257),i=c.dmax,j=c.wsize,k=c.whave,l=c.wnext,m=c.window,n=c.hold,o=c.bits,p=c.lencode,q=c.distcode,r=(1<o&&(n+=z[d++]<>>24,n>>>=u,o-=u,0===(u=t>>>16&255))A[f++]=65535&t;else{if(!(16&u)){if(0==(64&u)){t=p[(65535&t)+(n&(1<o&&(n+=z[d++]<>>=u,o-=u),15>o&&(n+=z[d++]<>>24,n>>>=u,o-=u,!(16&(u=t>>>16&255))){if(0==(64&u)){t=q[(65535&t)+(n&(1<o&&(n+=z[d++]<o&&(n+=z[d++]<i){a.msg="invalid distance too far back",c.mode=30;break a}if(n>>>=u,o-=u,u=f-g,w>u){if((u=w-u)>k&&c.sane){a.msg="invalid distance too far back",c.mode=30;break a}if(x=0,y=m,0===l){if(x+=j-u,v>u){v-=u;do{A[f++]=m[x++]}while(--u);x=f-w,y=A}}else if(u>l){if(x+=j+l-u,u-=l,v>u){v-=u;do{A[f++]=m[x++]}while(--u);if(x=0,v>l){u=l,v-=u;do{A[f++]=m[x++]}while(--u);x=f-w,y=A}}}else if(x+=l-u,v>u){v-=u;do{A[f++]=m[x++]}while(--u);x=f-w,y=A}for(;v>2;)A[f++]=y[x++],A[f++]=y[x++],A[f++]=y[x++],v-=3;v&&(A[f++]=y[x++],v>1&&(A[f++]=y[x++]))}else{x=f-w;do{A[f++]=A[x++],A[f++]=A[x++],A[f++]=A[x++],v-=3}while(v>2);v&&(A[f++]=A[x++],v>1&&(A[f++]=A[x++]))}break}}break}}while(e>d&&h>f);v=o>>3,d-=v,o-=v<<3,n&=(1<d?e-d+5:5-(d-e),a.avail_out=h>f?h-f+257:257-(f-h),c.hold=n,c.bits=o}},{}],35:[function(a,b,c){"use strict";function d(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=K,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new r.Buf32(oa),b.distcode=b.distdyn=new r.Buf32(pa),b.sane=1,b.back=-1,C):F}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):F}function h(a,b){var c,d;return a&&a.state?(d=a.state,0>b?(c=0,b=-b):(c=1+(b>>4),48>b&&(b&=15)),b&&(8>b||b>15)?F:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):F}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==C&&(a.state=null),c):F}function j(a){return i(a,qa)}function k(a){if(ra){var b;for(p=new r.Buf32(512),q=new r.Buf32(32),b=0;144>b;)a.lens[b++]=8;for(;256>b;)a.lens[b++]=9;for(;280>b;)a.lens[b++]=7;for(;288>b;)a.lens[b++]=8;for(v(x,a.lens,0,288,p,0,a.work,{bits:9}),b=0;32>b;)a.lens[b++]=5;v(y,a.lens,0,32,q,0,a.work,{bits:5}),ra=!1} a.lencode=p,a.lenbits=9,a.distcode=q,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<=f.wsize?(r.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),r.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(r.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whaven;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=t(c.check,Ba,2,0),m=0,n=0,c.mode=L;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=la;break}if((15&m)!==J){a.msg="unknown compression method",c.mode=la;break}if(m>>>=4,n-=4,wa=8+(15&m),0===c.wbits)c.wbits=wa;else if(wa>c.wbits){a.msg="invalid window size",c.mode=la;break}c.dmax=1<n;){if(0===i)break a;i--,m+=e[g++]<>8&1),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=t(c.check,Ba,2,0)),m=0,n=0,c.mode=M;case M:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<>>8&255,Ba[2]=m>>>16&255,Ba[3]=m>>>24&255,c.check=t(c.check,Ba,4,0)),m=0,n=0,c.mode=N;case N:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>8),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=t(c.check,Ba,2,0)),m=0,n=0,c.mode=O;case O:if(1024&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=t(c.check,Ba,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=P;case P:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wa=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),r.arraySet(c.head.extra,e,g,q,wa)),512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=Q;case Q:if(2048&c.flags){if(0===i)break a;q=0;do{wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.name+=String.fromCharCode(wa))}while(wa&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wa)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=R;case R:if(4096&c.flags){if(0===i)break a;q=0;do{wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.comment+=String.fromCharCode(wa))}while(wa&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wa)break a}else c.head&&(c.head.comment=null);c.mode=S;case S:if(512&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=V;break;case T:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<>>=7&n,n-=7&n,c.mode=ia;break}for(;3>n;){if(0===i)break a;i--,m+=e[g++]<>>=1,n-=1,3&m){case 0:c.mode=X;break;case 1:if(k(c),c.mode=ba,b===B){m>>>=2,n-=2;break a}break;case 2:c.mode=$;break;case 3:a.msg="invalid block type",c.mode=la}m>>>=2,n-=2;break;case X:for(m>>>=7&n,n-=7&n;32>n;){if(0===i)break a;i--,m+=e[g++]<>>16^65535)){a.msg="invalid stored block lengths",c.mode=la;break}if(c.length=65535&m,m=0,n=0,c.mode=Y,b===B)break a;case Y:c.mode=Z;case Z:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;r.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=V;break;case $:for(;14>n;){if(0===i)break a;i--,m+=e[g++]<>>=5,n-=5,c.ndist=1+(31&m),m>>>=5,n-=5,c.ncode=4+(15&m),m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=la;break}c.have=0,c.mode=_;case _:for(;c.haven;){if(0===i)break a;i--,m+=e[g++]<>>=3,n-=3}for(;c.have<19;)c.lens[Ca[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,ya={bits:c.lenbits},xa=v(w,c.lens,0,19,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg="invalid code lengths set",c.mode=la;break}c.have=0,c.mode=aa;case aa:for(;c.have>>24,ra=Aa>>>16&255,sa=65535&Aa,!(n>=qa);){if(0===i)break a;i--,m+=e[g++]<sa)m>>>=qa,n-=qa,c.lens[c.have++]=sa;else{if(16===sa){for(za=qa+2;za>n;){if(0===i)break a;i--,m+=e[g++]<>>=qa,n-=qa,0===c.have){a.msg="invalid bit length repeat",c.mode=la;break}wa=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sa){for(za=qa+3;za>n;){if(0===i)break a;i--,m+=e[g++]<>>=qa,n-=qa,wa=0,q=3+(7&m),m>>>=3,n-=3}else{for(za=qa+7;za>n;){if(0===i)break a;i--,m+=e[g++]<>>=qa,n-=qa,wa=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=la;break}for(;q--;)c.lens[c.have++]=wa}}if(c.mode===la)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=la;break}if(c.lenbits=9,ya={bits:c.lenbits},xa=v(x,c.lens,0,c.nlen,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg="invalid literal/lengths set",c.mode=la;break}if(c.distbits=6,c.distcode=c.distdyn,ya={bits:c.distbits},xa=v(y,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,ya),c.distbits=ya.bits,xa){a.msg="invalid distances set",c.mode=la;break}if(c.mode=ba,b===B)break a;case ba:c.mode=ca;case ca:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,u(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===V&&(c.back=-1);break}for(c.back=0;Aa=c.lencode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(n>=qa);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(n>=ta+qa);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,c.length=sa,0===ra){c.mode=ha;break}if(32&ra){c.back=-1,c.mode=V;break}if(64&ra){a.msg="invalid literal/length code",c.mode=la;break}c.extra=15&ra,c.mode=da;case da:if(c.extra){for(za=c.extra;za>n;){if(0===i)break a;i--,m+=e[g++]<>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=ea;case ea:for(;Aa=c.distcode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(n>=qa);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(n>=ta+qa);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,64&ra){a.msg="invalid distance code",c.mode=la;break}c.offset=sa,c.extra=15&ra,c.mode=fa;case fa:if(c.extra){for(za=c.extra;za>n;){if(0===i)break a;i--,m+=e[g++]<>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=la;break}c.mode=ga;case ga:if(0===j)break a;if(q=p-j,c.offset>q){if((q=c.offset-q)>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=la;break}q>c.wnext?(q-=c.wnext,oa=c.wsize-q):oa=c.wnext-q, q>c.length&&(q=c.length),pa=c.window}else pa=f,oa=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do{f[h++]=pa[oa++]}while(--q);0===c.length&&(c.mode=ca);break;case ha:if(0===j)break a;f[h++]=c.length,j--,c.mode=ca;break;case ia:if(c.wrap){for(;32>n;){if(0===i)break a;i--,m|=e[g++]<n;){if(0===i)break a;i--,m+=e[g++]<=y;y++)K[y]=0;for(z=0;j>z;z++)K[b[i+z]]++;for(C=x,B=d;B>=1&&0===K[B];B--);if(C>B&&(C=B),0===B)return k[l++]=20971520,k[l++]=20971520,n.bits=1,0;for(A=1;B>A&&0===K[A];A++);for(A>C&&(C=A),F=1,y=1;d>=y;y++)if(F<<=1,0>(F-=K[y]))return-1;if(F>0&&(0===a||1!==B))return-1;for(L[1]=0,y=1;d>y;y++)L[y+1]=L[y]+K[y];for(z=0;j>z;z++)0!==b[i+z]&&(m[L[b[i+z]]++]=z);if(0===a?(I=M=m,t=19):1===a?(I=e,J-=257,M=f,N-=257,t=256):(I=g,M=h,t=-1),H=0,z=0,y=A,s=l,D=C,E=0,q=-1,G=1<852||2===a&&G>592)return 1;for(var O=0;;){O++,u=y-E,m[z]t?(v=M[N+m[z]],w=I[J+m[z]]):(v=96,w=0),o=1<>E)+p]=u<<24|v<<16|w|0}while(0!==p);for(o=1<>=1;if(0!==o?(H&=o-1,H+=o):H=0,z++,0==--K[y]){if(y===B)break;y=b[i+m[z]]}if(y>C&&(H&r)!==q){for(0===E&&(E=C),s+=A,D=y-E,F=1<D+E&&!(0>=(F-=K[D+E]));)D++,F<<=1;if(G+=1<852||2===a&&G>592)return 1;q=H&r,k[q]=C<<24|D<<16|s-l|0}}return 0!==H&&(k[s+H]=y-E<<24|64<<16|0),n.bits=C,0}},{"../utils/common":27}],37:[function(a,b){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a){return 256>a?da[a]:da[256+(a>>>7)]}function f(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function g(a,b,c){a.bi_valid>T-c?(a.bi_buf|=b<>T-a.bi_valid,a.bi_valid+=c-T):(a.bi_buf|=b<>>=1,c<<=1}while(--b>0);return c>>>1}function j(a){16===a.bi_valid?(f(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function k(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;S>=f;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;R>c;c++)d=a.heap[c],f=i[2*i[2*d+1]+1]+1,f>o&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)(e=a.heap[--c])>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function l(a,b,c){var d,e,f=new Array(S+1),g=0;for(d=1;S>=d;d++)f[d]=g=g+c[d-1]<<1;for(e=0;b>=e;e++){var h=a[2*e+1];0!==h&&(a[2*e]=i(f[h]++,h))}}function m(){var a,b,c,d,e,f=new Array(S+1);for(c=0,d=0;M-1>d;d++)for(fa[d]=c,a=0;a<1<d;d++)for(ga[d]=e,a=0;a<1<<$[d];a++)da[e++]=d;for(e>>=7;P>d;d++)for(ga[d]=e<<7,a=0;a<1<<$[d]-7;a++)da[256+e++]=d;for(b=0;S>=b;b++)f[b]=0;for(a=0;143>=a;)ba[2*a+1]=8,a++,f[8]++;for(;255>=a;)ba[2*a+1]=9,a++,f[9]++;for(;279>=a;)ba[2*a+1]=7,a++,f[7]++;for(;287>=a;)ba[2*a+1]=8,a++,f[8]++;for(l(ba,O+1,f),a=0;P>a;a++)ca[2*a+1]=5,ca[2*a]=i(a,5);ha=new ka(ba,Z,N+1,O,S),ia=new ka(ca,$,0,P,S),ja=new ka(new Array(0),_,0,Q,U)}function n(a){var b;for(b=0;O>b;b++)a.dyn_ltree[2*b]=0;for(b=0;P>b;b++)a.dyn_dtree[2*b]=0;for(b=0;Q>b;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*V]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function o(a){a.bi_valid>8?f(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function p(a,b,c,d){o(a),d&&(f(a,c),f(a,~c)),E.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function q(a,b,c,d){var e=2*b,f=2*c;return a[e]c;c++)0!==f[2*c]?(a.heap[++a.heap_len]=j=c,a.depth[c]=0):f[2*c+1]=0;for(;a.heap_len<2;)e=a.heap[++a.heap_len]=2>j?++j:0,f[2*e]=1,a.depth[e]=0,a.opt_len--,h&&(a.static_len-=g[2*e+1]);for(b.max_code=j,c=a.heap_len>>1;c>=1;c--)r(a,f,c);e=i;do{c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],r(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,r(a,f,1)}while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],k(a,b),l(f,j,a.bl_count)}function u(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;c>=d;d++)e=g,g=b[2*(d+1)+1],++hh?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*W]++):10>=h?a.bl_tree[2*X]++:a.bl_tree[2*Y]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6, j=3):(i=7,j=4))}function v(a,b,c){var d,e,f=-1,i=b[1],j=0,k=7,l=4;for(0===i&&(k=138,l=3),d=0;c>=d;d++)if(e=i,i=b[2*(d+1)+1],!(++jj)do{h(a,e,a.bl_tree)}while(0!=--j);else 0!==e?(e!==f&&(h(a,e,a.bl_tree),j--),h(a,W,a.bl_tree),g(a,j-3,2)):10>=j?(h(a,X,a.bl_tree),g(a,j-3,3)):(h(a,Y,a.bl_tree),g(a,j-11,7));j=0,f=e,0===i?(k=138,l=3):e===i?(k=6,l=3):(k=7,l=4)}}function w(a){var b;for(u(a,a.dyn_ltree,a.l_desc.max_code),u(a,a.dyn_dtree,a.d_desc.max_code),t(a,a.bl_desc),b=Q-1;b>=3&&0===a.bl_tree[2*aa[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function x(a,b,c,d){var e;for(g(a,b-257,5),g(a,c-1,5),g(a,d-4,4),e=0;d>e;e++)g(a,a.bl_tree[2*aa[e]+1],3);v(a,a.dyn_ltree,b-1),v(a,a.dyn_dtree,c-1)}function y(a){var b,c=4093624447;for(b=0;31>=b;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return G;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return H;for(b=32;N>b;b++)if(0!==a.dyn_ltree[2*b])return H;return G}function z(a){ma||(m(),ma=!0),a.l_desc=new la(a.dyn_ltree,ha),a.d_desc=new la(a.dyn_dtree,ia),a.bl_desc=new la(a.bl_tree,ja),a.bi_buf=0,a.bi_valid=0,n(a)}function A(a,b,c,d){g(a,(J<<1)+(d?1:0),3),p(a,b,c,!0)}function B(a){g(a,K<<1,3),h(a,V,ba),j(a)}function C(a,b,c,d){var e,f,h=0;a.level>0?(a.strm.data_type===I&&(a.strm.data_type=y(a)),t(a,a.l_desc),t(a,a.d_desc),h=w(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,e>=f&&(e=f)):e=f=c+5,e>=c+4&&-1!==b?A(a,b,c,d):a.strategy===F||f===e?(g(a,(K<<1)+(d?1:0),3),s(a,ba,ca)):(g(a,(L<<1)+(d?1:0),3),x(a,a.l_desc.max_code+1,a.d_desc.max_code+1,h+1),s(a,a.dyn_ltree,a.dyn_dtree)),n(a),d&&o(a)}function D(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(ea[c]+N+1)]++,a.dyn_dtree[2*e(b)]++),a.last_lit===a.lit_bufsize-1}var E=a("../utils/common"),F=4,G=0,H=1,I=2,J=0,K=1,L=2,M=29,N=256,O=N+1+M,P=30,Q=19,R=2*O+1,S=15,T=16,U=7,V=256,W=16,X=17,Y=18,Z=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],$=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],_=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],aa=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],ba=new Array(2*(O+2));d(ba);var ca=new Array(2*P);d(ca);var da=new Array(512);d(da);var ea=new Array(256);d(ea);var fa=new Array(M);d(fa);var ga=new Array(P);d(ga);var ha,ia,ja,ka=function(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length},la=function(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b},ma=!1;c._tr_init=z,c._tr_stored_block=A,c._tr_flush_block=C,c._tr_tally=D,c._tr_align=B},{"../utils/common":27}],39:[function(a,b){"use strict";function c(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}b.exports=c},{}]},{},[9])(9)}),wmsx.EmbeddedFiles={get:function(a){if(a.indexOf("|")<0)return this.getFile(a);for(var b=a.split(/\s*\|\s*/),c=new Array(b.length),d=0;d0||(a.success=!0,a.content=wmsx.Util.arraysConcatAll(a.filesContent),a.onSuccess&&a.onSuccess(a),j())}function i(a,b){var d="Could not load file: "+a.url+"\nError: "+b;a.success=!1,a.error=b,a.errorMessage=d,a.onError?(wmsx.Util.error(d),a.onError(a)):c||wmsx.Util.message(d),j()}function j(){if(!q){for(var d=0;d>>8)}function memWrite16Rev(a,b){busWrite(a+1&65535,b>>>8),busWrite(a,255&b)}function busInput(a){return bus.input(a)}function busOutput(a,b){bus.output(a,b)}function busRead_R800(a){return W+=bus.getAccessWait(a),bus.read(a)}function busWrite_R800(a,b){W+=bus.getAccessWait(a),bus.write(a,b)}function fetchN_R800(){var a=pcInc();return W+=bus.getBreakWait(a,fetchLastAddress),fetchLastAddress=a,busRead_R800(a)}function fetchNN_R800(){return fetchN_R800()|fetchN_R800()<<8}function memRead_R800(a){return fetchForceNextBreak(),busRead_R800(a)}function memRead16_R800(a){return W+=bus.getBreakWait(a,a+1),fetchForceNextBreak(),busRead_R800(a)|busRead_R800(a+1&65535)<<8}function memWrite_R800(a,b){fetchForceNextBreak(),busWrite_R800(a,b)}function memWrite16_R800(a,b){W+=bus.getBreakWait(a,a+1),fetchForceNextBreak(),busWrite_R800(a,255&b),busWrite_R800(a+1&65535,b>>>8)}function memWrite16Rev_R800(a,b){W+=bus.getBreakWait(a,a+1),fetchForceNextBreak(),busWrite_R800(a+1&65535,b>>>8),busWrite_R800(a,255&b)}function busInput_R800(a){return W+=bus.getIOWait(a,clockMulti),bus.input(a)}function busOutput_R800(a,b){W+=bus.getIOWait(a,clockMulti),bus.output(a,b)}function pcInc(){var a=PC;return PC=PC+1&65535,a}function dec2PC(){return PC=PC-2&65535}function fromA(){return A}function fromB(){return B}function fromC(){return C}function fromD(){return DE>>>8}function fromE(){return 255&DE}function fromH(){return HL>>>8}function fromL(){return 255&HL}function fromIXh(){return IX>>>8}function fromIXl(){return 255&IX}function fromIYh(){return IY>>>8}function fromIYl(){return 255&IY}function toA(a){A=a}function toB(a){B=a}function toC(a){C=a}function toD(a){DE=255&DE|a<<8}function toE(a){DE=65280&DE|a}function toH(a){HL=255&HL|a<<8}function toL(a){HL=65280&HL|a}function toIXh(a){IX=255&IX|a<<8}function toIXl(a){IX=65280&IX|a}function toIYh(a){IY=255&IY|a<<8}function toIYl(a){IY=65280&IY|a}function fromAF(){return A<<8|F}function fromBC(){return B<<8|C}function fromDE(){return DE}function fromHL(){return HL}function fromSP(){return SP}function fromIX(){return IX}function fromIY(){return IY}function toAF(a){A=a>>>8,F=255&a}function toBC(a){B=a>>>8,C=255&a}function toDE(a){DE=a}function toHL(a){HL=a}function toSP(a){SP=a}function toIX(a){IX=a}function toIY(a){IY=a}function from_BC_8(){return memRead(fromBC())}function from_BC_8_R800(){return memRead_R800(fromBC())}function from_DE_8(){return memRead(DE)}function from_DE_8_R800(){return memRead_R800(DE)}function from_HL_8(){return memRead(HL)}function from_HL_8_R800(){return memRead_R800(HL)}function from_SP_16(){return memRead16(SP)}function from_SP_16_R800(){return memRead16_R800(SP)}function to_BC_8(a){memWrite(fromBC(),a)}function to_BC_8_R800(a){memWrite_R800(fromBC(),a)}function to_DE_8(a){memWrite(DE,a)}function to_DE_8_R800(a){memWrite_R800(DE,a)}function to_HL_8(a){memWrite(HL,a)}function to_HL_8_R800(a){memWrite_R800(HL,a)}function to_SP_16(a){memWrite16(SP,a)}function to_SP_16_R800(a){memWrite16_R800(SP,a)}function preReadIXYd(){preReadIXYdOffset=fetchN()}function preReadIXYd_R800(){preReadIXYdOffset=fetchN_R800()}function from_IXd_8(){return memRead(sum16Signed(IX,fetchN()))}function from_IXd_8_R800(){return memRead_R800(sum16Signed(IX,fetchN_R800()))}function from_IYd_8(){return memRead(sum16Signed(IY,fetchN()))}function from_IYd_8_R800(){return memRead_R800(sum16Signed(IY,fetchN_R800()))}function to_IXd_8(a){memWrite(sum16Signed(IX,fetchN()),a)}function to_IXd_8_R800(a){memWrite_R800(sum16Signed(IX,fetchN_R800()),a)}function to_IYd_8(a){memWrite(sum16Signed(IY,fetchN()),a)}function to_IYd_8_R800(a){memWrite_R800(sum16Signed(IY,fetchN_R800()),a)}function from_NN_8(){return memRead(fetchNN())}function from_NN_8_R800(){return memRead_R800(fetchNN_R800())}function to_NN_8(a){memWrite(fetchNN(),a)}function to_NN_8_R800(a){memWrite_R800(fetchNN_R800(),a)}function from_NN_16(){return memRead16(fetchNN())}function from_NN_16_R800(){return memRead16_R800(fetchNN_R800())}function to_NN_16(a){memWrite16(fetchNN(),a)}function to_NN_16_R800(a){memWrite16_R800(fetchNN_R800(),a)}function push16(a){SP=SP-2&65535,memWrite16Rev(SP,a)}function push16_R800(a){SP=SP-2&65535,memWrite16Rev_R800(SP,a)}function pop16(){var a=memRead16(SP);return SP=SP+2&65535,a}function pop16_R800(){var a=memRead16_R800(SP);return SP=SP+2&65535,a}function sum16Signed(a,b){return a+(b>127?-256+b:b)&65535}function NOP(){}function HALT(){--PC}function newLD(a,b){return function(){a(b())}}function LDAI(){A=I,F=1&F|168&A|(0===A)<9)&&(a-=6),(F&bC||A>153)&&(a-=96)):((F&bH||(15&A)>9)&&(a+=6),(F&bC||A>153)&&(a+=96)),a&=255,F=3&F|168&a|(0===a)<153,A=a}function CPL(){A=255&~A,F=197&F|18|40&A}function NEG(){var a=A;A=255&-A,F=bN|168&A|(0===A)<>>7),F=196&F|40&A|A&bC}function RLA(){var a=A;A=255&(A<<1|F&bC),F=196&F|40&A|a>>>7&bC}function RRCA(){A=255&(A>>>1|A<<7),F=196&F|40&A|A>>>7}function RRA(){var a=A;A=A>>>1|(F&bC)<<7,F=196&F|40&A|a&bC}function newRLD(a){var b=a?from_HL_8_R800:from_HL_8,c=a?to_HL_8_R800:to_HL_8;return function(){var a=b();c(255&(a<<4|15&A)),A=240&A|a>>>4, F=F&bC|168&A|(0===A)<>>4)),A=240&A|15&a,F=F&bC|168&A|(0===A)<>>6^d>>>5)&bPV|c>>>8&bC}}function newADC(a){return function(){var b=a(),c=A+b+(F&bC),d=A^b^c;A=255&c,F=168&A|(0===A)<>>6^d>>>5)&bPV|c>>>8&bC}}function newSUB(a){return function(){var b=a(),c=A-b,d=A^b^c;A=255&c,F=bN|168&A|(0===A)<>>6^d>>>5)&bPV|c>>>8&bC}}function newSBC(a){return function(){var b=a(),c=A-b-(F&bC),d=A^b^c;A=255&c,F=bN|168&A|(0===A)<>>6^d>>>5)&bPV|c>>>8&bC}}function newAND(a){return function(){A&=a(),F=bH|168&A|(0===A)<>>6^d>>>5)&bPV|c>>>8&bC}}function newINC(a,b){return function(){var c=a()+1&255;b(c),F=F&bC|168&c|(0===c)<>>8&40|(d^e^f)>>>8&bH|f>>>16&bC}}function newADC16(a,b,c){return function(){var d=b(),e=c(),f=d+e+(F&bC);a(65535&f);var g=(d^e^f)>>>8;F=f>>>8&168|(0==(65535&f))<>>6^g>>>5)&bPV|f>>>16&bC}}function newSBC16(a,b,c){return function(){var d=b(),e=c(),f=d-e-(F&bC);a(65535&f);var g=(d^e^f)>>>8;F=bN|f>>>8&168|(0==(65535&f))<>>6^g>>>5)&bPV|f>>>16&bC}}function newINC16(a,b){return function(){a(b()+1&65535)}}function newDEC16(a,b){return function(){a(b()-1&65535)}}function newRLC(a,b,c){return function(){var d=b(),e=255&(d<<1|d>>>7);a(e),c&&c(e),F=168&e|(0===e)<>>7&bC}}function newRRC(a,b,c){return function(){var d=b(),e=255&(d>>>1|d<<7);a(e),c&&c(e),F=168&e|(0===e)<>>1|(F&bC)<<7);a(e),c&&c(e),F=168&e|(0===e)<>>7&bC}}function newSRA(a,b,c){return function(){var d=b(),e=d>>>1|128&d;a(e),c&&c(e),F=168&e|(0===e)<>>7&bC}}function newSRL(a,b,c){return function(){var d=b(),e=d>>>1;a(e),c&&c(e),F=168&e|(0===e)<255}}function newMULUW(a){return function(){var b=HL*a();DE=b>>>16,HL=65535&b,F=18&F|40&b|(0===b)<65535}}function uNOP(){}function uIN_C(){var a=busInput(fromBC());F=F&bC|168&a|(0===a)<0&&(extExtraIter=a.extraIterations))}return function d(){if(null===extCurrRunning){extCurrRunning=a,extExtraIter=0;c(bus.cpuExtensionBegin(b(a))),d()}else if(extExtraIter>0)--extExtraIter,dec2PC();else{var e=bus.cpuExtensionFinish(b(a));c(e),extCurrRunning=null}}}function defineInstructionSet(a,b,c){function d(a,b,d,f,g,h,i,j){var k={};return k.prefix=b?a<<8|b:a,k.opcode=d,k.remainCyclesZ80=f+1,k.remainCyclesR800=g,k.totalCyclesZ80=k.remainCyclesZ80+(a?5:0)+(b?4:0),k.totalCyclesR800=k.remainCyclesR800+(a?1:0)+(b?1:0),k.remainCycles=c?k.remainCyclesR800-1:k.remainCyclesZ80-1,k.operation=h,k.mnemonic=i,k.undocumented=j,k.opcodeString=(k.prefix?wmsx.Util.toHex2(k.prefix):"")+(56779===k.prefix||64971===k.prefix?" ":"")+wmsx.Util.toHex2(k.opcode)+" "+i+(j?"*":""),k.toString=function(){return this.opcodeString},e(k),k}function e(b){if(instructionsAllOld.push(b),b.prefix)if(237===b.prefix)a[1][b.opcode]=b;else if(203===b.prefix)a[2][b.opcode]=b;else if(221===b.prefix)a[3][b.opcode]=b;else if(253===b.prefix)a[4][b.opcode]=b;else if(56779===b.prefix)a[5][b.opcode]=b;else{if(64971!==b.prefix)throw new Error("Invalid instruction prefix!");a[6][b.opcode]=b}else a[0][b.opcode]=b}var f,g,h=0,i=0,j={A:{bits:7,to:toA,from:fromA,desc:"A"},B:{bits:0,to:toB,from:fromB,desc:"B"},C:{bits:1,to:toC,from:fromC,desc:"C"},D:{bits:2,to:toD,from:fromD,desc:"D"},E:{bits:3,to:toE,from:fromE,desc:"E"},H:{bits:4,to:toH,from:fromH,desc:"H"},L:{bits:5,to:toL,from:fromL,desc:"L"}},k={A:{bits:7,to:toA,from:fromA,desc:"A"},B:{bits:0,to:toB,from:fromB,desc:"B"},C:{bits:1,to:toC,from:fromC,desc:"C"},D:{bits:2,to:toD,from:fromD,desc:"D"},E:{bits:3,to:toE,from:fromE,desc:"E"},H:{bits:4,to:toH,from:fromH,desc:"H",nopref:!0},L:{bits:5,to:toL,from:fromL,desc:"L",nopref:!0},IXh:{bits:4,to:toIXh,from:fromIXh,desc:"IXh",pref:221},IXl:{bits:5,to:toIXl,from:fromIXl,desc:"IXl",pref:221},IYh:{bits:4,to:toIYh,from:fromIYh,desc:"IYh",pref:253},IYl:{bits:5,to:toIYl,from:fromIYl,desc:"IYl",pref:253}},l={_HL_:{to:b?to_HL_8_R800:to_HL_8,from:b?from_HL_8_R800:from_HL_8,desc:"(HL)"},_IXd_:{to:b?to_IXd_8_R800:to_IXd_8,from:b?from_IXd_8_R800:from_IXd_8,desc:"(IX+d)",pref:221},_IYd_:{to:b?to_IYd_8_R800:to_IYd_8,from:b?from_IYd_8_R800:from_IYd_8,desc:"(IY+d)",pref:253}},m=64;for(g in k){var n=k[g];for(f in k){var o=k[f];if(!(n.pref&&(o.nopref||o.pref&&o.pref!=n.pref)||o.pref&&(n.nopref||n.pref&&n.pref!=o.pref))){var p=m|n.bits<<3|o.bits,q=newLD(n.to,o.from),r=n.pref|o.pref;d(r,null,p,4,1,q,"LD "+n.desc+", "+o.desc,r)}}}m=6;for(g in k)n=k[g],p=m|n.bits<<3,q=newLD(n.to,b?fetchN_R800:fetchN),r=n.pref,d(r,null,p,7,2,q,"LD "+n.desc+", n",r);m=70;for(g in j){n=j[g];for(f in l)o=l[f],p=m|n.bits<<3,q=newLD(n.to,o.from),r=o.pref,d(r,null,p,7+(r?8:0),2+br+(r?2:0),q,"LD "+n.desc+", "+o.desc,!1)}m=112;for(g in l){n=l[g];for(f in j)o=j[f],p=m|o.bits,q=newLD(n.to,o.from),r=n.pref,d(r,null,p,7+(r?8:0),2+bw+(r?2:0),q,"LD "+n.desc+", "+o.desc,!1)}m=54;for(g in l)n=l[g],p=m,r=n.pref,q=r?newLD_PreRead_IXYd_(n.to.toPreReadAddr,b?fetchN_R800:fetchN,b):newLD(n.to,b?fetchN_R800:fetchN),d(r,null,p,10+(r?5:0),3+bw+(r?1:0),q,"LD "+n.desc+", n",!1);p=10,q=newLD(toA,b?from_BC_8_R800:from_BC_8),d(null,null,p,7,2+br,q,"LD A, (BC)",!1),p=26,q=newLD(toA,b?from_DE_8_R800:from_DE_8),d(null,null,p,7,2+br,q,"LD A, (DE)",!1),p=58,q=newLD(toA,b?from_NN_8_R800:from_NN_8),d(null,null,p,13,4+br,q,"LD A, (nn)",!1),p=2,q=newLD(b?to_BC_8_R800:to_BC_8,fromA),d(null,null,p,7,2+bw,q,"LD (BC), A",!1),p=18,q=newLD(b?to_DE_8_R800:to_DE_8,fromA),d(null,null,p,7,2+bw,q,"LD (DE), A",!1),p=50,q=newLD(b?to_NN_8_R800:to_NN_8,fromA),d(null,null,p,13,4+bw,q,"LD (nn), A",!1),p=87,q=LDAI,d(null,237,p,5,2,q,"LD A, I",!1),p=95,q=LDAR,d(null,237,p,5,2,q,"LD A, R",!1),p=71,q=LDIA,d(null,237,p,5,2,q,"LD I, A",!1),p=79,q=LDRA,d(null,237,p,5,2,q,"LD R, A",!1);var s={BC:{bits:0,to:toBC,from:fromBC,desc:"BC"},DE:{bits:1,to:toDE,from:fromDE,desc:"DE"},HL:{bits:2,to:toHL,from:fromHL,desc:"HL"},SP:{bits:3,to:toSP,from:fromSP,desc:"SP"}},t={BC:{bits:0,to:toBC,from:fromBC,desc:"BC"},DE:{bits:1,to:toDE,from:fromDE,desc:"DE"},HL:{bits:2,to:toHL,from:fromHL,desc:"HL",nopref:!0},SP:{bits:3,to:toSP,from:fromSP,desc:"SP"},IX:{bits:2,to:toIX,from:fromIX,desc:"IX",pref:221},IY:{bits:2,to:toIY,from:fromIY,desc:"IY",pref:253}},u={BC:{bits:0,to:toBC,from:fromBC,desc:"BC"},DE:{bits:1,to:toDE,from:fromDE,desc:"DE"},HL:{bits:2,to:toHL,from:fromHL,desc:"HL"},AF:{bits:3,to:toAF,from:fromAF,desc:"AF"},IX:{bits:2,to:toIX,from:fromIX,desc:"IX",pref:221},IY:{bits:2,to:toIY,from:fromIY,desc:"IY",pref:253}},v={HL:{to:toHL,from:fromHL,desc:"HL",nopref:!0},IXd:{to:toIX,from:fromIX,desc:"IX",pref:221},IYd:{to:toIY,from:fromIY,desc:"IY",pref:253}};m=1;for(g in t)n=t[g],p=m|n.bits<<4,q=newLD(n.to,b?fetchNN_R800:fetchNN),r=n.pref,d(r,null,p,10,3,q,"LD "+n.desc+", nn",!1);p=42;for(g in v)n=v[g],q=newLD(n.to,b?from_NN_16_R800:from_NN_16),r=n.pref,d(r,null,p,16,5+br,q,"LD "+n.desc+", (nn)",!1);m=75;for(g in s)n=s[g],p=m|n.bits<<4,q=newLD(n.to,b?from_NN_16_R800:from_NN_16),d(null,237,p,16,5+br,q,"LD "+n.desc+", (nn)",!1);p=34;for(f in v)o=v[f],q=newLD(b?to_NN_16_R800:to_NN_16,o.from),r=o.pref,d(r,null,p,16,5+bw,q,"LD (nn), "+o.desc,!1);m=67;for(f in s)o=s[f],p=m|o.bits<<4,q=newLD(b?to_NN_16_R800:to_NN_16,o.from),d(null,237,p,16,5+bw,q,"LD (nn), "+o.desc,!1);p=249;for(f in v)o=v[f],q=newLD(toSP,o.from),r=o.pref,d(r,null,p,6,1,q,"LD SP, "+o.desc,!1);m=197;for(f in u)o=u[f],p=m|o.bits<<4,q=newPUSH(o.from,b),r=o.pref,d(r,null,p,11,4+bw,q,"PUSH "+o.desc,!1);m=193;for(g in u)n=u[g],p=m|n.bits<<4,q=newPOP(n.to,b),r=n.pref,d(r,null,p,10,3+br,q,"POP "+n.desc,!1);p=235,q=EXDEHL,d(null,null,p,4,1,q,"EX DE, HL",!1),p=8,q=EXAFAF2,d(null,null,p,4,1,q,"EX AF, AF'",!1),p=217,q=EXX,d(null,null,p,4,1,q,"EXX",!1),p=227;for(var w in v){var x=v[w];q=newEXr_SP_16(x.to,x.from,b),r=x.pref,d(r,null,p,19,5+bw,q,"EX (SP), "+x.desc,!1)}p=160,q=newLDI(b),d(null,237,p,12,3+br+bw,q,"LDI",!1),p=176,q=newLDIR(q,c),d(null,237,p,12,3+br+bw,q,"LDIR",!1),p=168,q=newLDD(b),d(null,237,p,12,3+br+bw,q,"LDD",!1),p=184,q=newLDDR(q,c),d(null,237,p,12,3+br+bw,q,"LDDR",!1),p=161,q=newCPI(b),d(null,237,p,12,3+br,q,"CPI",!1),p=177,q=newCPIR(q,c),d(null,237,p,12,4+br,q,"CPIR",!1),p=169,q=newCPD(b),d(null,237,p,12,3+br,q,"CPD",!1),p=185,q=newCPDR(q,c),d(null,237,p,12,4+br,q,"CPDR",!1);var y={ADD:{desc:"ADD A, ",instr:newADD,variations:{rp:{opcode:128},n:{opcode:198},_HLp_:{opcode:134,T:7,Tr:2+br}}},ADC:{desc:"ADC A, ",instr:newADC,variations:{rp:{opcode:136},n:{opcode:206},_HLp_:{opcode:142,T:7,Tr:2+br}}},SUB:{desc:"SUB ",instr:newSUB,variations:{rp:{opcode:144},n:{opcode:214},_HLp_:{opcode:150,T:7,Tr:2+br}}},SBC:{desc:"SBC A, ",instr:newSBC,variations:{rp:{opcode:152},n:{opcode:222},_HLp_:{opcode:158,T:7,Tr:2+br}}},AND:{desc:"AND ",instr:newAND,variations:{rp:{opcode:160},n:{opcode:230},_HLp_:{opcode:166,T:7,Tr:2+br}}},OR:{desc:"OR ",instr:newOR,variations:{rp:{opcode:176},n:{opcode:246},_HLp_:{opcode:182,T:7,Tr:2+br}}},XOR:{desc:"XOR ",instr:newXOR,variations:{rp:{opcode:168},n:{opcode:238},_HLp_:{opcode:174,T:7,Tr:2+br}}},CP:{desc:"CP ",instr:newCP,variations:{rp:{opcode:184},n:{opcode:254},_HLp_:{opcode:190,T:7,Tr:2+br}}},INC:{desc:"INC ",instr:newINC,selfModifyInstr:newINC_PreRead_IXYd_,variations:{rp:{opcode:4,rShift:3},_HLp_:{opcode:52,T:11,Tr:4+br+bw}}},DEC:{desc:"DEC ",instr:newDEC,selfModifyInstr:newDEC_PreRead_IXYd_,variations:{rp:{opcode:5,rShift:3},_HLp_:{opcode:53,T:11,Tr:4+br+bw}}}};for(var z in y){var A=y[z],B=A.variations.rp;m=B.opcode;for(w in k)x=k[w],p=m|x.bits<",!1),p=237,q=pSET_ED,d(null,null,p,4,1,q,"< SET ED >",!1),p=221,q=pSET_DD,d(null,null,p,4,1,q,"< SET DD >",!1),p=221,q=pSET_DD,d(221,null,p,4,1,q,"< SET DD again >",!1),p=253,q=pSET_FD,d(221,null,p,4,1,q,"< SWITCH to FD >",!1),p=203,q=newpSET_DDCB(b),d(221,null,p,3,1,q,"< SET DDCB >",!1),p=253,q=pSET_FD,d(null,null,p,4,1,q,"< SET FD >",!1),p=253,q=pSET_FD,d(253,null,p,4,1,q,"< SET FD again >",!1),p=221,q=pSET_DD,d(253,null,p,4,1,q,"< SWITCH to DD >",!1),p=203,q=newpSET_FDCB(b),d(253,null,p,3,1,q,"< SET FDCB >",!1),p=257,q=NOP,instrWait=d(null,null,p,1,1,q,"< WAIT CYCLES >",!1),p=258, q=b?pINT_IM01_R800:pINT_IM01,d(null,null,p,13,3+bw,q,"< INT_M01 >",!1),p=259,q=b?pINT_IM2_R800:pINT_IM2,d(null,null,p,19,5+bw+br,q,"< INT_M2 >",!1);for(var S=0,T=a.length;S=wmsx.Machine.MACHINE_TYPE.MSXTR,updateR800Present()},this.powerOn=function(){setINT(255),this.reset(),toAF(65533),toBC(65535),DE=65535,HL=65535,AF2=65533,BC2=65535,DE2=65535,HL2=65535,toIX(65535),toIY(65535),SP=65535,writeState(modeBackState)},this.powerOff=function(){},this.reset=function(){r800=!1,cpuCycles=0,busCycles=0,cpuToBusCycles=0,ackINT=!1,prefix=0,T=0,W=0,opcode=0,instruction=void 0,PC=0,I=0,R=0,R7=0,IFF1=0,IM=0,extCurrRunning=null,extExtraIter=0,fetchForceNextBreak(),writeState(modeBackState),updateInstructionSet()},this.setR800Mode=function(a){r800!==a&&(r800=a,swapModeState(),updateInstructionSet(),updateClockMulti())},this.setZ80BUSRQ=function(a){z80BUSRQ=a},this.busClockPulsesZ80=function(a){if(!z80BUSRQ)for(var b=cpuCycles+(a*clockMulti|0);cpuCycles0||(T<0?ackINT?acknowledgeINT():fetchNextInstruction():instruction.operation())},this.busClockPulsesBoth=function(a){if(!z80BUSRQ||r800)for(var b=cpuCycles+(a*clockMulti|0);cpuCycles0))if(T<0){if(W>0){--W;continue}ackINT?acknowledgeINT():(fetchNextInstruction(),0===T&&instruction.operation())}else instruction.operation()},this.busClockPulses=this.busClockPulsesZ80,this.r800MemoryRefresh=function(){r800&&(++R,W+=28)},this.setINTChannel=function(a,b){setINT(b?INT|1<8?8:a,r800||updateClockMulti()},this.getZ80ClockMulti=function(){return z80ClockMulti},this.setR800ClockMulti=function(a){r800ClockMulti=2*(a<=0?1:a>2?2:a),r800&&updateClockMulti()},this.getR800ClockMulti=function(){return r800ClockMulti/2},this.getClockFreqDesc=function(a){return(3.58*a).toFixed(2)+" MHz"};var r800=!1,r800Present=!1,modeBackState={},modeFrontState={},z80BUSRQ=!1,z80ClockMulti=1,r800ClockMulti=2,clockMulti=z80ClockMulti,cpuCycles=0,busCycles=0,cpuToBusCycles=0,extCurrRunning=null,extExtraIter=0,bus,INT=255,PC=0,SP=0,A=0,F=0,B=0,C=0,DE=0,HL=0,IX=0,IY=0,AF2=0,BC2=0,DE2=0,HL2=0,I=0,R=0,R7=0,IFF1=0,IM=0,bS=128,nS=7,bZ=64,nZ=6,bF5=32,nF5=5,bH=16,nH=4,bF3=8,nF3=3,bPV=4,nPV=2,bN=2,nN=1,bC=1,nC=0,T=0,W=0,opcode=0,prefix=0,instruction,ackINT=!1,fetchLastAddress=0,instructionsNoPrefixZ80=new Array(280),instructionsByPrefixZ80=[instructionsNoPrefixZ80,new Array(280),new Array(280),new Array(280),new Array(280),new Array(280),new Array(280),instructionsNoPrefixZ80],instructionsNoPrefixR800=new Array(280),instructionsByPrefixR800=[instructionsNoPrefixR800,new Array(280),new Array(280),new Array(280),new Array(280),new Array(280),new Array(280),instructionsNoPrefixR800],instructionsAll=[],instructionsAllOld=[],instructionsNoPrefix,instructionsByPrefix,instrWait;1!==r800Timing&&(busRead_R800=busRead,busWrite_R800=busWrite,fetchN_R800=fetchN,fetchNN_R800=fetchNN,memRead_R800=memRead,memRead16_R800=memRead16,memWrite_R800=memWrite,memWrite16_R800=memWrite16,memWrite16Rev_R800=memWrite16Rev),0===r800Timing&&(busInput_R800=busInput,busOutput_R800=busOutput);var preReadIXYdOffset=0;from_IXd_8.fromPreReadAddr=function(){return memRead(sum16Signed(IX,preReadIXYdOffset))},from_IXd_8_R800.fromPreReadAddr=function(){return memRead_R800(sum16Signed(IX,preReadIXYdOffset))},from_IYd_8.fromPreReadAddr=function(){return memRead(sum16Signed(IY,preReadIXYdOffset))},from_IYd_8_R800.fromPreReadAddr=function(){return memRead_R800(sum16Signed(IY,preReadIXYdOffset))},to_IXd_8.toPreReadAddr=function(a){memWrite(sum16Signed(IX,preReadIXYdOffset),a)},to_IXd_8_R800.toPreReadAddr=function(a){memWrite_R800(sum16Signed(IX,preReadIXYdOffset),a)},to_IYd_8.toPreReadAddr=function(a){memWrite(sum16Signed(IY,preReadIXYdOffset),a)},to_IYd_8_R800.toPreReadAddr=function(a){memWrite_R800(sum16Signed(IY,preReadIXYdOffset),a)};var parities=[4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4],br=1,bw=1;this.saveState=function(){return{PC:PC,SP:SP,A:A,F:F,B:B,C:C,DE:DE,HL:HL,IX:IX,IY:IY,AF2:AF2,BC2:BC2,DE2:DE2,HL2:HL2,I:I,R:R,R7:R7,IM:IM,IFF1:IFF1,INT:INT,nINT:1,cc:cpuCycles,bc:busCycles,cbc:cpuToBusCycles,Tn:T,W:W,o:opcode,p:prefix,ai:ackINT,in:instructionsAll.indexOf(instruction),ecr:extCurrRunning,eei:extExtraIter,r8p:r800Present,r8:r800,bs:modeBackState,tcm:z80ClockMulti,rcm:r800ClockMulti}},this.loadState=function(a){PC=a.PC,SP=a.SP,A=a.A,F=a.F,B=a.B,C=a.C,DE=a.DE,HL=a.HL,IX=a.IX,IY=a.IY,AF2=a.AF2,BC2=a.BC2,DE2=a.DE2,HL2=a.HL2,I=a.I,R=a.R,R7=a.R7||0,IM=a.IM,IFF1=a.IFF1,setINT(a.nINT?a.INT:a.INT?255:254),cpuCycles=a.cc||0,busCycles=a.bc||a.c||0,cpuToBusCycles=a.cbc||0,T=void 0!==a.Tn?a.Tn:a.T-1,W=a.W||0,opcode=a.o,prefix=a.p,ackINT=a.ai,extCurrRunning=a.ecr,extExtraIter=a.eei,r800Present=!!a.r8p,r800=!!a.r8,updateR800Present(),instruction=a.in>=0?instructionsAll[a.in]:instructionsAllOld[a.ii],a.bs&&(modeBackState=a.bs),z80ClockMulti=void 0!==a.tcm?a.tcm:a.tcs>0?2:1,r800ClockMulti=void 0!==a.rcm?a.rcm:2,updateInstructionSet(),updateClockMulti()},init(),this.toString=function(){return"CPU PC: "+wmsx.Util.toHex2(PC)+" op: "+(instruction?instruction.mnemonic:"NULL")+" cycle: "+busCycles+"\n\nA: "+wmsx.Util.toHex2(A)+" B: "+wmsx.Util.toHex2(B)+" C: "+wmsx.Util.toHex2(C)+" D: "+wmsx.Util.toHex2(DE>>>8)+" E: "+wmsx.Util.toHex2(255&DE)+" H: "+wmsx.Util.toHex2(HL>>>8)+" L: "+wmsx.Util.toHex2(255&HL)+"\nBC: "+wmsx.Util.toHex2(fromBC())+" DE: "+wmsx.Util.toHex2(DE)+" HL: "+wmsx.Util.toHex2(HL)+" IX: "+wmsx.Util.toHex2(IX)+" IY: "+wmsx.Util.toHex2(IY)+" SP: "+wmsx.Util.toHex2(SP)+"\n\nFlags: "+(F&bS?"S ":"- ")+(F&bZ?"Z ":"- ")+(F&bF5?"5 ":"- ")+(F&bH?"H ":"- ")+(F&bF3?"3 ":"- ")+(F&bPV?"P ":"- ")+(F&bN?"N ":"- ")+(F&bC?"C":"-")+" IFF: "+IFF1+" INT: "+wmsx.Util.toHex2(INT)+" prefix: "+prefix},this.eval=function(str){return eval(str)}},wmsx.CPU.BASE_CLOCK=3584160,wmsx.PPI=function(a,b,c){"use strict";function d(){i=15&h}function e(){a.setPulseSignal((160&h)>0)}function f(){c.ledStateChanged(0,(64&~h)>>6)}this.connectBus=function(a){g=a,g.connectInputDevice(168,this.inputA8),g.connectOutputDevice(168,this.outputA8),g.connectInputDevice(169,this.inputA9),g.connectOutputDevice(169,wmsx.DeviceMissing.outputPortIgnored),g.connectInputDevice(170,this.inputAA),g.connectOutputDevice(170,this.outputAA),g.connectInputDevice(171,wmsx.DeviceMissing.inputPortIgnored),g.connectOutputDevice(171,this.outputAB)},this.powerOn=function(){this.reset()},this.powerOff=function(){this.reset()},this.reset=function(){h=80,i=0,e(),f()},this.inputA8=function(){return g.getPrimarySlotConfig()},this.outputA8=function(a){g.setPrimarySlotConfig(a)},this.inputA9=function(){return b.readKeyboardPort(i)},this.inputAA=function(){return h},this.outputAA=function(a){var b=h^a;b&&(h=a,15&b&&d(),160&b&&e(),64&b&&f())},this.outputAB=function(a){var b=(14&a)>>>1;0==(1&a)?h&=~(1<31?a-64:a}function c(a){return a<=0?0:a>=31?31:a}this.setColorAndPaletteMode=function(a,b){q!==a&&(q=a,d=e=f=g=h=i=j=void 0),r!==b&&(r=b,d=void 0)},this.getColors4bit9918Values=function(){if(!d){d=new Uint32Array(16);for(var b=p[r],c=0;c<16;++c){var e=b[c];d[c]=a(e>>16&255,e>>8&255,255&e)}}return d},this.getColors8bit9938Values=function(){if(!e){e=new Uint32Array(256);for(var b=0;b<256;++b)e[b]=a(k[3&b],l[b>>5],l[b>>2&7])}return e},this.getColors9bit9938Values=function(){if(!f){f=new Uint32Array(512);for(var b=0;b<512;++b)f[b]=a(l[7&b],l[b>>6],l[b>>3&7])}return f},this.getColors8bit9990Values=function(b){if(!g){g=new Uint32Array(256);for(var c=0;c<256;++c)g[c]=a(m[3&c],n[c>>5],n[c>>2&7])}return g[0]=b?0:4278190080,g},this.getColors16bitValues=function(){if(!h){h=new Uint32Array(65536);for(var b=0;b<65536;++b)h[b]=a(o[31&b],o[b>>10&31],o[b>>5&31],b<32768?1:0)}return h},this.getColorsYUVValues=function(){if(!i){i=new Uint32Array(131072);for(var d=0;d<131072;++d){var e=d>>12,f=b(d>>6&63),g=b(63&d),h=c(e+f),j=c(5*e-(f<<1)-g>>2),k=c(e+g);i[d]=a(o[k],o[j],o[h])}}return i},this.getColorsYJKValues=function(){if(!j){j=new Uint32Array(131072);for(var d=0;d<131072;++d){var e=d>>12,f=b(d>>6&63),g=b(63&d),h=c(e+f),i=c(e+g),k=c(5*e-(f<<1)-g>>2);j[d]=a(o[k],o[i],o[h])}}return j};var d=void 0,e=void 0,f=void 0,g=void 0,h=void 0,i=void 0,j=void 0,k=[0,73,146,255],l=[0,36,73,109,146,182,219,255],m=[0,90,172,255],n=[0,32,74,106,148,180,222,255],o=[0,8,16,24,32,41,49,57,65,74,82,90,98,106,115,123,131,139,148,156,164,172,180,189,197,205,213,222,230,238,246,255],p=[new Uint32Array([4278190080,4278190080,4280863239,4284867133,4293936196,4294208880,4279447760,4293978176,4282532595,4286085364,4281387728,4287225052,4280330502,4291117274,4290559164,4294967295]),new Uint32Array([4278190080,4278190080,4279102208,4283495232,4294920013,4294927993,4281026041,4294967058,4281157119,4283460095,4278569950,4282701040,4278962944,4293019364,4291611852,4294967295]),new Uint32Array([4278190080,4278190080,4283086656,4286500725,4292302425,4293883776,4283523e3,4293843814,4284114649,4286483197,4284531660,4287156446,4282556731,4290013110,4291611852,4294967295]),new Uint32Array([4278190080,4278190080,4280605476,4285398893,4294911012,4294929737,4280558774,4294957897,4280558847,4285361663,4280605659,4287814619,4280586788,4290136539,4290164406,4294967295]),new Uint32Array([4278190080,4278190080,4284927078,4287164040,4292691012,4294932343,4283782587,4292730231,4284901085,4286019583,4283813068,4287164142,4283804245,4290467259,4291611852,4294967295]),new Uint32Array([4278190080,4278190080,4278255360,4278255360,4294901760,4294901760,4278190335,4294967040,4278190335,4278190335,4278255615,4278255615,4278255360,4294902015,4294967295,4294967295])],q=0,r=2},wmsx.VDP=function(machine,cpu,vSyncConnection){"use strict";function init(){videoSignal=new wmsx.VideoSignal(self,"Internal"),audioClockPulse32=machine.getAudioSocket().audioClockPulse32,initColorCaches(),initFrameResources(!1),initDebugPatternTables(),initSpritesConflictMap(),modeData=modes[0],backdropCacheUpdatePending=!0,self.setDefaults(),commandProcessor=new wmsx.VDPCommandProcessor,commandProcessor.connectVDP(self,vram,register,status),commandProcessor.setVDPModeData(modeData),renderWidth=wmsx.VDP.SIGNAL_START_WIDTH_V9938,renderHeight=1===WMSX.MACHINES_CONFIG[WMSX.MACHINE].TYPE?wmsx.VDP.SIGNAL_HEIGHT_V9918:wmsx.VDP.SIGNAL_START_HEIGHT_V9938}function registerWrite(a,b){if(!(a>46)){var c,d=register[a]^b;switch(register[a]=b,a){case 0:16&d&&updateIRQ(),14&d&&updateMode();break;case 1:32&d&&updateIRQ(),64&d&&(blankingChangePending=!0),24&d&&updateMode(),4&d&&updateBlinking(),3&d&&updateSpritesConfig();break;case 2:127&d&&updateLayoutTableAddress();break;case 10:if(0==(7&d))break;case 3:c=131071&(register[10]<<14|register[3]<<6),colorTableAddress=c&modeData.colorTBase,colorTableAddressMask=c|colorTableAddressMaskBase;break;case 4:if(0==(63&d))break;c=b<<11&131071,patternTableAddress=c&modeData.patTBase,patternTableAddressMask=c|patternTableAddressMaskBase;break;case 11:if(0==(3&d))break;case 5:c=131071&(register[11]<<15|register[5]<<7),spriteAttrTableAddress=c&modeData.sprAttrTBase;break;case 6:63&d&&updateSpritePatternTableAddress();break;case 7:d&(modeData.bdPaletted?15:255)&&updateBackdropColor();break;case 8:32&d&&updateTransparency(),2&d&&updateSpritesConfig();break;case 9:128&d&&updateSignalMetrics(!1),8&d&&updateRenderMetrics(!1),4&d&&updateLayoutTableAddressMask(),2&d&&updateVideoStandardSoft();break;case 13:updateBlinking();break;case 14:7&d&&(vramPointer=(7&b)<<14|16383&vramPointer);break;case 16:paletteFirstWrite=null;break;case 18:15&d&&(horizontalAdjust=(15&b^7)-7),240&d&&(verticalAdjust=(b>>>4^7)-7,updateSignalMetrics(!1));break;case 19:horizontalIntLine=b-register[23]&255;break;case 23:horizontalIntLine=register[19]-b&255;break;case 25:isV9958&&(24&d&&updateMode(),leftMask=0!=(2&b),leftScroll2Pages=0!=(1&b));break;case 26:isV9958&&(leftScrollChars=63&b,leftScrollCharsInPage=31&leftScrollChars);break;case 27:isV9958&&(rightScrollPixels=7&b);break;case 44:commandProcessor.cpuWrite(b);break;case 46:commandProcessor.startCommand(b)}}}function updateLayoutTableAddress(){var a=modeData.vramInter?(63®ister[2])<<11|1024:(127®ister[2])<<10;layoutTableAddress=a&modeData.layTBase,layoutTableAddressMaskSetValue=a|layoutTableAddressMaskBase,updateLayoutTableAddressMask()}function updateLayoutTableAddressMask(){layoutTableAddressMask=layoutTableAddressMaskSetValue&(blinkEvenPage||4®ister[9]&&!EO?modeData.blinkPageMask:-1)}function updateSpritePatternTableAddress(){spritePatternTableAddress=debugModeSpriteInfo?16===spritesSize?DEBUG_PAT_DIGI16_TABLE_ADDRESS:DEBUG_PAT_DIGI8_TABLE_ADDRESS:register[6]<<11&131071}function getStatus0(){var a=0;return F&&(a|=128,F=0,updateIRQ()),spritesCollided&&(a|=32,spritesCollided=!1),spritesInvalid>=0?(a|=64|spritesInvalid,spritesInvalid=-1):a|=spritesMaxComputed,spritesMaxComputed=0,a}function checkVRAMPointerWrap(){0==(16383&vramPointer)&&(modeData.isV9938&&(register[14]=register[14]+1&7),vramPointer=register[14]<<14)}function paletteRegisterWrite(a,b,c){if(paletteRegister[a]!==b||c){paletteRegister[a]=b;var d=getColorValueForPaletteValue(b);colorPaletteReal[a]=d,debugModeSpriteHighlight&&(d&=DEBUG_DIM_ALPHA_MASK),colorPaletteSolid[a]=d,0===a?color0Solid&&(colorPalette[0]=d):colorPalette[a]=d,a===backdropColor?updateBackdropValue():modeData.tiled&&a<=3&&(backdropCacheUpdatePending=!0)}}function getColorValueForPaletteValue(a){return colors9bitValues[(1792&a)>>>2|(112&a)>>>1|7&a]}function setDebugMode(a){debugMode=(a+8)%8;var b=debugModeSpriteHighlight;debugModeSpriteHighlight=debugMode>=1&&debugMode<=3,debugModeSpriteInfo=2===debugMode||3===debugMode,debugModeSpriteInfoNumbers=2===debugMode,debugModeSpritesHidden=debugMode>=4;var c=debugModePatternInfo;debugModePatternInfo=debugMode>=5,debugModePatternInfoBlocks=6===debugMode,debugModePatternInfoNames=7===debugMode,b===debugModeSpriteHighlight&&c===debugModePatternInfo||updateAllPaletteValues(),initFrameResources(debugModeSpriteHighlight),updateLineActiveType(),updateSpritesConfig(),updateSpritePatternTableAddress(),slave&&slave.setDebugMode(debugMode),videoSignal.setDebugMode(debugMode>0)}function setSpriteDebugMode(a){spriteDebugMode=a>=0?a%4:4+a,spriteDebugModeLimit=0===spriteDebugMode||2===spriteDebugMode,spriteDebugModeCollisions=spriteDebugMode<2,slave&&slave.setSpriteDebugMode(spriteDebugMode)}function updateAllPaletteValues(){if(isV9918)initColorPalette();else for(var a=0;a<16;a++)paletteRegisterWrite(a,paletteRegister[a],!0)} function updateSynchronization(){pulldown=1===vSynchMode?videoStandard.pulldowns[machine.getVideoClockSocket().getVSynchNativeFrequency()]||videoStandard.pulldowns.TIMER:videoStandard.pulldowns.TIMER}function cycleEvents(){var a=framePulldown.linesPerCycle;pulldown.steps>1&&frame%pulldown.steps==0&&(a+=pulldown.firstStepCycleLinesAdjust);for(var b=a;b>0;--b)lineEvents()}function lineEvents(){blinkPerLine&&blinkPageDuration>0&&clockPageBlinking()&&updateLayoutTableAddressMask(),currentScanline===startingActiveScanline?setActiveDisplay():currentScanline-frameStartingActiveScanline===signalActiveHeight&&setBorderDisplay(),cpuMemoryRefresh(),cpuBusClockPulses(33),audioClockPulse32(),blankingChangePending&&updateLineActiveType(),FH&&0==(16®ister[0])&&(FH=0),currentScanline===startingActiveScanline-1?VR=0:currentScanline-frameStartingActiveScanline===signalActiveHeight&&triggerVerticalInterrupt(),cpuBusClockPulses(10),HR=0,slave&&slave.lineEventStartActiveDisplay(),cpuBusClockPulses(22),audioClockPulse32(),cpuBusClockPulses(33),audioClockPulse32(),cpuBusClockPulses(32),audioClockPulse32(),currentScanline>=startingVisibleTopBorderScanline&¤tScanline=finishingScanline&&(finishFrame(),slave&&slave.frameEventFinishFrame())}function triggerVerticalInterrupt(){VR=1,F||(F=1,updateIRQ())}function triggerHorizontalInterrupt(){FH||(FH=1,updateIRQ())}function updateIRQ(){F&&32®ister[1]||FH&&16®ister[0]?cpu.setINTChannel(0,0):cpu.setINTChannel(0,1)}function updateVRAMInterleaving(){!0!==modeData.vramInter||vramInterleaving?!1===modeData.vramInter&&vramInterleaving&&vramExitInterleaving():vramEnterInterleaving()}function vramEnterInterleaving(){for(var a=0,b=VRAM_SIZE>>1,c=vram.slice(0,b),d=0;d>1,b=0,c=a,d=vram.slice(a),e=0;e>>1;commandProcessor.setVDPModeData(modes[c]),isV9958&&0!=(8®ister[25])&&0==(16&c)&&(c=32|(24®ister[25])>>3),modeData=modes[c];var d;updateLayoutTableAddress(),d=131071&(register[10]<<14|register[3]<<6),colorTableAddress=d&modeData.colorTBase,colorTableAddressMask=d|colorTableAddressMaskBase,d=register[4]<<11&131071,patternTableAddress=d&modeData.patTBase,patternTableAddressMask=d|patternTableAddressMaskBase,d=131071&(register[11]<<15|register[5]<<7),spriteAttrTableAddress=d&modeData.sprAttrTBase,updateSpritePatternTableAddress(),modeData.bdPaletted!==b.bdPaletted&&updateBackdropColor(),modeData.tiled!==b.tiled&&(backdropCacheUpdatePending=!0),updateVRAMInterleaving(),updateLineActiveType(),updateRenderMetrics(a)}function updateVideoStandardSoft(){var a=2®ister[9];machine.setVideoStandardSoft(a?wmsx.VideoStandard.PAL:wmsx.VideoStandard.NTSC)}function updateSignalMetrics(a){var b;isV9918&&!slave?(signalActiveHeight=192,b=0):!isV9918&&128®ister[9]?(signalActiveHeight=212,b=0):(signalActiveHeight=192,b=10),startingVisibleTopBorderScanline=8,startingActiveScanline=startingVisibleTopBorderScanline+8+b+verticalAdjust,startingInvisibleScanline=startingActiveScanline+signalActiveHeight+8+b-verticalAdjust,finishingScanline=frameVideoStandard.totalHeight,a&&(frameStartingActiveScanline=startingActiveScanline)}function updateRenderMetrics(a){var b,c,d=!1,e=!1;isV9918&&!slave?(b=wmsx.VDP.SIGNAL_WIDTH_V9918,c=wmsx.VDP.SIGNAL_HEIGHT_V9918):(b=512===modeData.width?544:272,c=!isV9918&&8®ister[9]?456:228),renderMetricsChangePending=!1,b===renderWidth&&c===renderHeight||(b!==renderWidth&&(currentScanlinerenderWidth?(currentScanline>=startingVisibleTopBorderScanline&&(a?e=!0:stretchFromCurrentToTopScanline()),renderWidth=b,d=!0):renderMetricsChangePending=!0),c!==renderHeight&&(a?((currentScanline>=startingVisibleTopBorderScanline||c>renderHeight)&&(e=!0),renderHeight=c,d=!0):renderMetricsChangePending=!0),e&&cleanFrameBuffer(),d&&self.refreshDisplayMetrics())}function setActiveDisplay(){renderLine=renderLineActive}function setBorderDisplay(){renderLine=renderLineBorders}function updateLineActiveType(){var a=renderLine===renderLineActive;renderLineActive=0==(64®ister[1])?renderLineBlanked:debugModePatternInfo?modeData.renderLinePatInfo:modeData.renderLine,a&&(renderLine=renderLineActive),blankingChangePending=!1}function updateSpritesConfig(){spritesEnabled=!debugModeSpritesHidden&&0==(2®ister[8]),spritesSize=2®ister[1]?16:8,spritesMag=1®ister[1]}function updateTransparency(){color0Solid=0!=(32®ister[8]),colorPalette[0]=color0Solid?colorPaletteSolid[0]:backdropValue}function updateBackdropColor(){backdropColor=register[7]&(modeData.bdPaletted?15:255),updateBackdropValue()}function updateBackdropValue(){var a=debugModePatternInfo?debugBackdropValue:modeData.bdPaletted?colorPaletteSolid[backdropColor]:colors8bitValues[backdropColor];backdropValue!==a&&(backdropValue=a,color0Solid||(colorPalette[0]=a),backdropCacheUpdatePending=!0)}function updateBackdropLineCache(){if(modeData.tiled&&!debugModePatternInfo){for(var a=colorPaletteSolid[backdropColor>>>2],b=colorPaletteSolid[3&backdropColor],c=0;c>>4==0?(blinkEvenPage=!1,blinkPageDuration=0):0==(15®ister[13])?(blinkEvenPage=!0,blinkPageDuration=0):(blinkEvenPage=!0,blinkPageDuration=1),updateLayoutTableAddressMask()}function clockPageBlinking(){return 0==--blinkPageDuration&&(blinkEvenPage=!blinkEvenPage,blinkPageDuration=10*(register[13]>>>(blinkEvenPage?4:0)&15),!0)}function renderLineBorders(){videoDisplayed&&(backdropCacheUpdatePending&&updateBackdropLineCache(),frameBackBuffer.set(backdropLineCache,bufferPosition),bufferPosition+=bufferLineAdvance)}function renderLineBlanked(){renderLineBorders()}function getRealLine(){return currentScanline-frameStartingActiveScanline+register[23]&255}function renderLineModeT1(){if(videoDisplayed){paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var a=bufferPosition+8+horizontalAdjust+rightScrollPixels,b=getRealLine(),c=register[7],d=patternTableAddress+(7&b),e=colorPalette[c>>>4],f=colorPalette[15&c],g=layoutTableAddress+40*(b>>>3);paintBackdrop8(a),a+=8;for(var h=0;h<40;++h){var i=vram[g];++g;paintPattern6(a,vram[(i<<3)+d],e,f),a+=6}paintBackdrop8(a),a+=8,a-=rightScrollPixels+256,leftMask&&paintBackdrop8(a),rightScrollPixels&&paintBackdrop8(a+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}}function renderLineModeT2(){if(videoDisplayed){paintBackdrop32(bufferPosition),paintBackdrop32(bufferPosition+512);var a,b,c,d,e,f=bufferPosition+16+(horizontalAdjust+rightScrollPixels<<1),g=getRealLine(),h=patternTableAddress+(7&g),i=layoutTableAddress+80*(g>>>3);if(paintBackdrop16(f),f+=16,blinkEvenPage)for(var j=colorTableAddress+10*(g>>>3),k=7,l=0;l<80;++l){var m=vram[j&colorTableAddressMask]>>>k&1;a=vram[i&layoutTableAddressMask],++i, c=register[m?12:7],b=vram[(a<<3)+h],d=m?colorPaletteSolid[c>>>4]:colorPalette[c>>>4],e=m?colorPaletteSolid[15&c]:colorPalette[15&c],paintPattern6(f,b,d,e),--k<0&&(++j,k=7),f+=6}else for(c=register[7],d=colorPalette[c>>>4],e=colorPalette[15&c],l=0;l<80;++l)a=vram[i&layoutTableAddressMask],++i,b=vram[(a<<3)+h],paintPattern6(f,b,d,e),f+=6;paintBackdrop16(f),f+=16,f-=512+(rightScrollPixels<<1),leftMask&&paintBackdrop16(f),rightScrollPixels&&paintBackdrop16(f+512),bufferPosition+=bufferLineAdvance}}function renderLineModeMC(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode1(a,0);paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var b=bufferPosition+8+horizontalAdjust+rightScrollPixels,c=patternTableAddress+((a>>>3&3)<<1)+(a>>>2&1),d=layoutTableAddress+(a>>>3<<5),e=d+leftScrollCharsInPage;leftScroll2Pages&&leftScrollChars<32&&(e&=modeData.evenPageMask);for(var f=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,g=0;g<32;++g){g===f&&(e=leftScroll2Pages&&leftScrollChars>=32?d&modeData.evenPageMask:d);var h=vram[e];++e;var i=(h<<3)+c,j=vram[i];paintPattern8(b,240,colorPalette[j>>>4],colorPalette[15&j]),b+=8}b-=rightScrollPixels+256,renderSpritesLineMode1(a,b),leftMask&&paintBackdrop8(b),rightScrollPixels&&paintBackdrop8(b+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeG1(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode1(a,0);paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var b=bufferPosition+8+horizontalAdjust+rightScrollPixels,c=patternTableAddress+(7&a),d=layoutTableAddress+(a>>>3<<5),e=d+leftScrollCharsInPage;leftScroll2Pages&&leftScrollChars<32&&(e&=modeData.evenPageMask);for(var f=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,g=0;g<32;++g){g===f&&(e=leftScroll2Pages&&leftScrollChars>=32?d&modeData.evenPageMask:d);var h=vram[e];++e;var i=vram[colorTableAddress+(h>>>3)];paintPattern8(b,vram[(h<<3)+c],colorPalette[i>>>4],colorPalette[15&i]),b+=8}b-=rightScrollPixels+256,renderSpritesLineMode1(a,b),leftMask&&paintBackdrop8(b),rightScrollPixels&&paintBackdrop8(b+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeG2(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode1(a,0);paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var b=bufferPosition+8+horizontalAdjust+rightScrollPixels,c=colorTableAddress+(7&a),d=patternTableAddress+(7&a),e=(192&a)<<2,f=layoutTableAddress+(a>>>3<<5),g=f+leftScrollCharsInPage;leftScroll2Pages&&leftScrollChars<32&&(g&=modeData.evenPageMask);for(var h=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,i=0;i<32;++i){i===h&&(g=leftScroll2Pages&&leftScrollChars>=32?f&modeData.evenPageMask:f);var j=vram[g]|e;++g;var k=vram[(j<<3)+c&colorTableAddressMask];paintPattern8(b,vram[(j<<3)+d&patternTableAddressMask],colorPalette[k>>>4],colorPalette[15&k]),b+=8}b-=rightScrollPixels+256,renderSpritesLineMode1(a,b),leftMask&&paintBackdrop8(b),rightScrollPixels&&paintBackdrop8(b+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeG3(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode2(a,0,colorPaletteReal);paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var b=bufferPosition+8+horizontalAdjust+rightScrollPixels,c=colorTableAddress+(7&a),d=patternTableAddress+(7&a),e=(192&a)<<2,f=layoutTableAddress+(a>>>3<<5),g=f+leftScrollCharsInPage;leftScroll2Pages&&leftScrollChars<32&&(g&=modeData.evenPageMask);for(var h=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,i=0;i<32;++i){i===h&&(g=leftScroll2Pages&&leftScrollChars>=32?f&modeData.evenPageMask:f);var j=vram[g]|e;++g;var k=vram[(j<<3)+c&colorTableAddressMask];paintPattern8(b,vram[(j<<3)+d&patternTableAddressMask],colorPalette[k>>>4],colorPalette[15&k]),b+=8}b-=rightScrollPixels+256,renderSpritesLineMode2(a,b,colorPaletteReal),leftMask&&paintBackdrop8(b),rightScrollPixels&&paintBackdrop8(b+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeG4(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode2(a,0,colorPaletteReal);paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var b=bufferPosition+8+horizontalAdjust+rightScrollPixels,c=layoutTableAddress+(a<<7),d=c+(leftScrollCharsInPage<<2);leftScroll2Pages&&leftScrollChars<32&&(d&=modeData.evenPageMask);for(var e=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,f=0;f<32;++f){f===e&&(d=leftScroll2Pages&&leftScrollChars>=32?c&modeData.evenPageMask:c);var g=vram[d&layoutTableAddressMask];++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b}b-=rightScrollPixels+256,renderSpritesLineMode2(a,b,colorPaletteReal),leftMask&&paintBackdrop8(b),rightScrollPixels&&paintBackdrop8(b+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeG5(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode2Tiled(a,0);paintBackdrop32Tiled(bufferPosition),paintBackdrop32Tiled(bufferPosition+512);var b=bufferPosition+16+(horizontalAdjust+rightScrollPixels<<1),c=layoutTableAddress+(a<<7),d=c+(leftScrollCharsInPage<<2);leftScroll2Pages&&leftScrollChars<32&&(d&=modeData.evenPageMask);var e=leftScrollCharsInPage?32-leftScrollCharsInPage:-1;if(color0Solid)for(var f=0;f<32;++f){f===e&&(d=leftScroll2Pages&&leftScrollChars>=32?c&modeData.evenPageMask:c);var g=vram[d&layoutTableAddressMask];++d,frameBackBuffer[b]=colorPaletteSolid[g>>>6],++b,frameBackBuffer[b]=colorPaletteSolid[g>>>4&3],++b,frameBackBuffer[b]=colorPaletteSolid[g>>>2&3],++b,frameBackBuffer[b]=colorPaletteSolid[3&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPaletteSolid[g>>>6],++b,frameBackBuffer[b]=colorPaletteSolid[g>>>4&3],++b,frameBackBuffer[b]=colorPaletteSolid[g>>>2&3],++b,frameBackBuffer[b]=colorPaletteSolid[3&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPaletteSolid[g>>>6],++b,frameBackBuffer[b]=colorPaletteSolid[g>>>4&3],++b,frameBackBuffer[b]=colorPaletteSolid[g>>>2&3],++b,frameBackBuffer[b]=colorPaletteSolid[3&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPaletteSolid[g>>>6],++b,frameBackBuffer[b]=colorPaletteSolid[g>>>4&3],++b,frameBackBuffer[b]=colorPaletteSolid[g>>>2&3],++b,frameBackBuffer[b]=colorPaletteSolid[3&g],++b}else for(f=0;f<32;++f)f===e&&(d=leftScroll2Pages&&leftScrollChars>=32?c&modeData.evenPageMask:c),g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=192&g?colorPaletteSolid[g>>>6]:backdropTileOdd,++b,frameBackBuffer[b]=48&g?colorPaletteSolid[g>>>4&3]:backdropTileEven,++b,frameBackBuffer[b]=12&g?colorPaletteSolid[g>>>2&3]:backdropTileOdd,++b,frameBackBuffer[b]=3&g?colorPaletteSolid[3&g]:backdropTileEven,++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=192&g?colorPaletteSolid[g>>>6]:backdropTileOdd,++b,frameBackBuffer[b]=48&g?colorPaletteSolid[g>>>4&3]:backdropTileEven,++b,frameBackBuffer[b]=12&g?colorPaletteSolid[g>>>2&3]:backdropTileOdd,++b,frameBackBuffer[b]=3&g?colorPaletteSolid[3&g]:backdropTileEven,++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=192&g?colorPaletteSolid[g>>>6]:backdropTileOdd,++b,frameBackBuffer[b]=48&g?colorPaletteSolid[g>>>4&3]:backdropTileEven,++b,frameBackBuffer[b]=12&g?colorPaletteSolid[g>>>2&3]:backdropTileOdd,++b,frameBackBuffer[b]=3&g?colorPaletteSolid[3&g]:backdropTileEven,++b,g=vram[d&layoutTableAddressMask],++d, frameBackBuffer[b]=192&g?colorPaletteSolid[g>>>6]:backdropTileOdd,++b,frameBackBuffer[b]=48&g?colorPaletteSolid[g>>>4&3]:backdropTileEven,++b,frameBackBuffer[b]=12&g?colorPaletteSolid[g>>>2&3]:backdropTileOdd,++b,frameBackBuffer[b]=3&g?colorPaletteSolid[3&g]:backdropTileEven,++b;b-=512+(rightScrollPixels<<1),renderSpritesLineMode2Tiled(a,b),leftMask&&paintBackdrop16Tiled(b),rightScrollPixels&&paintBackdrop16Tiled(b+512),bufferPosition+=bufferLineAdvance}function renderLineModeG6(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode2Stretched(a,0);paintBackdrop32(bufferPosition),paintBackdrop32(bufferPosition+512);var b=bufferPosition+16+(horizontalAdjust+rightScrollPixels<<1),c=layoutTableAddress+(a<<8),d=c+(leftScrollCharsInPage<<3);leftScroll2Pages&&leftScrollChars<32&&(d&=modeData.evenPageMask);for(var e=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,f=0;f<32;++f){f===e&&(d=leftScroll2Pages&&leftScrollChars>=32?c&modeData.evenPageMask:c);var g=vram[d&layoutTableAddressMask];++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b,g=vram[d&layoutTableAddressMask],++d,frameBackBuffer[b]=colorPalette[g>>>4],++b,frameBackBuffer[b]=colorPalette[15&g],++b}b-=512+(rightScrollPixels<<1),renderSpritesLineMode2Stretched(a,b),leftMask&&paintBackdrop16(b),rightScrollPixels&&paintBackdrop16(b+512),bufferPosition+=bufferLineAdvance}function renderLineModeG7(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode2(a,0,spritePaletteG7);paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var b=bufferPosition+8+horizontalAdjust+rightScrollPixels,c=debugModeSpriteHighlight?DEBUG_DIM_ALPHA_MASK:4294967295,d=layoutTableAddress+(a<<8),e=d+(leftScrollCharsInPage<<3);leftScroll2Pages&&leftScrollChars<32&&(e&=modeData.evenPageMask);for(var f=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,g=0;g<32;++g)g===f&&(e=leftScroll2Pages&&leftScrollChars>=32?d&modeData.evenPageMask:d),frameBackBuffer[b]=colors8bitValues[vram[e&layoutTableAddressMask]]&c,++e,++b,frameBackBuffer[b]=colors8bitValues[vram[e&layoutTableAddressMask]]&c,++e,++b,frameBackBuffer[b]=colors8bitValues[vram[e&layoutTableAddressMask]]&c,++e,++b,frameBackBuffer[b]=colors8bitValues[vram[e&layoutTableAddressMask]]&c,++e,++b,frameBackBuffer[b]=colors8bitValues[vram[e&layoutTableAddressMask]]&c,++e,++b,frameBackBuffer[b]=colors8bitValues[vram[e&layoutTableAddressMask]]&c,++e,++b,frameBackBuffer[b]=colors8bitValues[vram[e&layoutTableAddressMask]]&c,++e,++b,frameBackBuffer[b]=colors8bitValues[vram[e&layoutTableAddressMask]]&c,++e,++b;b-=rightScrollPixels+256,renderSpritesLineMode2(a,b,spritePaletteG7),leftMask&&paintBackdrop8(b),rightScrollPixels&&paintBackdrop8(b+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeYJK(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode2(a,0,colorPaletteReal);paintBackdrop20(bufferPosition),paintBackdrop16(bufferPosition+256+4),colorsYJKValues||(colorsYJKValues=wmsx.ColorCache.getColorsYJKValues());var b=bufferPosition+8+horizontalAdjust+rightScrollPixels+4,c=layoutTableAddress+(a<<8),d=c+(leftScrollCharsInPage<<3);leftScroll2Pages&&leftScrollChars<32&&(d&=modeData.evenPageMask);for(var e,f,g,h,i,j=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,k=0;k<32;++k)k===j&&(d=leftScroll2Pages&&leftScrollChars>=32?c&modeData.evenPageMask:c),e=vram[d&layoutTableAddressMask],++d,f=vram[d&layoutTableAddressMask],++d,g=vram[d&layoutTableAddressMask],++d,h=vram[d&layoutTableAddressMask],++d,i=(7&h)<<9|(7&g)<<6|(7&f)<<3|7&e,frameBackBuffer[b]=colorsYJKValues[(248&e)<<9|i],++b,frameBackBuffer[b]=colorsYJKValues[(248&f)<<9|i],++b,frameBackBuffer[b]=colorsYJKValues[(248&g)<<9|i],++b,frameBackBuffer[b]=colorsYJKValues[(248&h)<<9|i],++b,e=vram[d&layoutTableAddressMask],++d,f=vram[d&layoutTableAddressMask],++d,g=vram[d&layoutTableAddressMask],++d,h=vram[d&layoutTableAddressMask],++d,i=(7&h)<<9|(7&g)<<6|(7&f)<<3|7&e,frameBackBuffer[b]=colorsYJKValues[(248&e)<<9|i],++b,frameBackBuffer[b]=colorsYJKValues[(248&f)<<9|i],++b,frameBackBuffer[b]=colorsYJKValues[(248&g)<<9|i],++b,frameBackBuffer[b]=colorsYJKValues[(248&h)<<9|i],++b;b-=rightScrollPixels+256,renderSpritesLineMode2(a,b,colorPaletteReal),leftMask&&paintBackdrop8(b),rightScrollPixels&&paintBackdrop8(b+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeYAE(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode2(a,0,colorPaletteReal);paintBackdrop20(bufferPosition),paintBackdrop16(bufferPosition+256+4),colorsYJKValues||(colorsYJKValues=wmsx.ColorCache.getColorsYJKValues());var b=bufferPosition+8+horizontalAdjust+rightScrollPixels+4,c=layoutTableAddress+(a<<8),d=c+(leftScrollCharsInPage<<3);leftScroll2Pages&&leftScrollChars<32&&(d&=modeData.evenPageMask);for(var e,f,g,h,i,j=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,k=0;k<32;++k)k===j&&(d=leftScroll2Pages&&leftScrollChars>=32?c&modeData.evenPageMask:c),e=vram[d&layoutTableAddressMask],++d,f=vram[d&layoutTableAddressMask],++d,g=vram[d&layoutTableAddressMask],++d,h=vram[d&layoutTableAddressMask],++d,i=(7&h)<<9|(7&g)<<6|(7&f)<<3|7&e,frameBackBuffer[b]=8&e?colorPalette[e>>4]:colorsYJKValues[(248&e)<<9|i],++b,frameBackBuffer[b]=8&f?colorPalette[f>>4]:colorsYJKValues[(248&f)<<9|i],++b,frameBackBuffer[b]=8&g?colorPalette[g>>4]:colorsYJKValues[(248&g)<<9|i],++b,frameBackBuffer[b]=8&h?colorPalette[h>>4]:colorsYJKValues[(248&h)<<9|i],++b,e=vram[d&layoutTableAddressMask],++d,f=vram[d&layoutTableAddressMask],++d,g=vram[d&layoutTableAddressMask],++d,h=vram[d&layoutTableAddressMask],++d,i=(7&h)<<9|(7&g)<<6|(7&f)<<3|7&e,frameBackBuffer[b]=8&e?colorPalette[e>>4]:colorsYJKValues[(248&e)<<9|i],++b,frameBackBuffer[b]=8&f?colorPalette[f>>4]:colorsYJKValues[(248&f)<<9|i],++b,frameBackBuffer[b]=8&g?colorPalette[g>>4]:colorsYJKValues[(248&g)<<9|i],++b,frameBackBuffer[b]=8&h?colorPalette[h>>4]:colorsYJKValues[(248&h)<<9|i],++b;b-=rightScrollPixels+256,renderSpritesLineMode2(a,b,colorPaletteReal),leftMask&&paintBackdrop8(b),rightScrollPixels&&paintBackdrop8(b+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeT1PatInfo(){if(videoDisplayed){paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var a=bufferPosition+8+horizontalAdjust+rightScrollPixels,b=getRealLine(),c=7&b,d=layoutTableAddress+40*(b>>>3);paintBackdrop8(a),a+=8;for(var e=0;e<40;++e){var f=vram[d];if(++d,debugModePatternInfoNames){var g=0===f||32===f?4293787648:4294967295,h=vram[DEBUG_PAT_DIGI6_TABLE_ADDRESS+(f<<3)+c];paintPattern6TInfo(a,h,g,4278190080)}else h=vram[patternTableAddress+(f<<3)+c],paintPattern6(a,h,4294967295,4278190080);a+=6}paintBackdrop8(a),a+=8,a-=rightScrollPixels+256,leftMask&&paintBackdrop8(a),rightScrollPixels&&paintBackdrop8(a+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}}function renderLineModeT2PatInfo(){if(videoDisplayed){paintBackdrop32(bufferPosition),paintBackdrop32(bufferPosition+512);var a,b,c,d=bufferPosition+16+(horizontalAdjust+rightScrollPixels<<1),e=getRealLine(),f=7&e,g=layoutTableAddress+80*(e>>>3) ;if(paintBackdrop16(d),d+=16,blinkEvenPage)for(var h=colorTableAddress+10*(e>>>3),i=7,j=0;j<80;++j){var k=vram[h&colorTableAddressMask]>>>i&1;a=vram[g&layoutTableAddressMask],++g,debugModePatternInfoNames?(c=0===a||32===a?4293787648:4294967295,k&&(c&=4288716960),b=vram[DEBUG_PAT_DIGI6_TABLE_ADDRESS+(a<<3)+f],paintPattern6TInfo(d,b,c,4278190080)):(b=vram[patternTableAddress+(a<<3)+f],paintPattern6(d,b,k?4288716960:4294967295,4278190080)),--i<0&&(++h,i=7),d+=6}else for(j=0;j<80;++j)a=vram[g&layoutTableAddressMask],++g,debugModePatternInfoNames?(c=0===a||32===a?4293787648:4294967295,b=vram[DEBUG_PAT_DIGI6_TABLE_ADDRESS+(a<<3)+f],paintPattern6TInfo(d,b,c,4278190080)):(b=vram[patternTableAddress+(a<<3)+f],paintPattern6(d,b,4294967295,4278190080)),d+=6;paintBackdrop16(d),d+=16,d-=512+(rightScrollPixels<<1),leftMask&&paintBackdrop16(d),rightScrollPixels&&paintBackdrop16(d+512),bufferPosition+=bufferLineAdvance}}function paintPattern6TInfo(a,b,c,d){var e=2550136831&c;frameBackBuffer[a]=128&b?c:d,frameBackBuffer[a+1]=64&b?c:d,frameBackBuffer[a+2]=32&b?c:d,frameBackBuffer[a+3]=16&b?e:d,frameBackBuffer[a+4]=8&b?e:d,frameBackBuffer[a+5]=4&b?e:d}function renderLineModeMCPatInfo(){if(!debugModePatternInfoNames)return renderLineModeMC();var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode1(a,0);paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var b=bufferPosition+8+horizontalAdjust+rightScrollPixels,c=layoutTableAddress+(a>>>3<<5),d=c+leftScrollCharsInPage;leftScroll2Pages&&leftScrollChars<32&&(d&=modeData.evenPageMask);for(var e=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,f=0;f<32;++f){f===e&&(d=leftScroll2Pages&&leftScrollChars>=32?c&modeData.evenPageMask:c);var g=vram[d];++d;paintPattern8(b,vram[DEBUG_PAT_DIGI8_TABLE_ADDRESS+(g<<3)+(7&a)],4294967295,4278190080),b+=8}b-=rightScrollPixels+256,renderSpritesLineMode1(a,b),leftMask&&paintBackdrop8(b),rightScrollPixels&&paintBackdrop8(b+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeG1PatInfo(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode1(a,0);paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var b,c,d,e=bufferPosition+8+horizontalAdjust+rightScrollPixels,f=7&a,g=layoutTableAddress+(a>>>3<<5),h=g+leftScrollCharsInPage;leftScroll2Pages&&leftScrollChars<32&&(h&=modeData.evenPageMask);for(var i=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,j=0;j<32;++j){j===i&&(h=leftScroll2Pages&&leftScrollChars>=32?g&modeData.evenPageMask:g);var k=vram[h];if(++h,debugModePatternInfoNames)c=0===k||32===k?4293787648:4294967295,d=4278190080,b=vram[DEBUG_PAT_DIGI8_TABLE_ADDRESS+(k<<3)+f];else if(debugModePatternInfoBlocks){var l=vram[colorTableAddress+(k>>>3)];c=colorPalette[l>>>4],d=colorPalette[15&l],b=vram[DEBUG_PAT_BLOCK_TABLE_ADDRESS+f]}else c=4294967295,d=4278190080,b=vram[patternTableAddress+(k<<3)+f];paintPattern8(e,b,c,d),e+=8}e-=rightScrollPixels+256,renderSpritesLineMode1(a,e),leftMask&&paintBackdrop8(e),rightScrollPixels&&paintBackdrop8(e+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeG2PatInfo(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode1(a,0);paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var b,c,d,e=bufferPosition+8+horizontalAdjust+rightScrollPixels,f=7&a,g=(192&a)<<2,h=layoutTableAddress+(a>>>3<<5),i=h+leftScrollCharsInPage;leftScroll2Pages&&leftScrollChars<32&&(i&=modeData.evenPageMask);for(var j=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,k=0;k<32;++k){k===j&&(i=leftScroll2Pages&&leftScrollChars>=32?h&modeData.evenPageMask:h);var l=vram[i]|g;if(++i,debugModePatternInfoNames)l&=255,c=0===l||32===l?4293787648:4294967295,d=4278190080,b=vram[DEBUG_PAT_DIGI8_TABLE_ADDRESS+(l<<3)+f];else if(debugModePatternInfoBlocks){var m=vram[colorTableAddress+(l<<3)+f&colorTableAddressMask];c=colorPalette[m>>>4],d=colorPalette[15&m],b=vram[DEBUG_PAT_BLOCK_TABLE_ADDRESS+f]}else c=4294967295,d=4278190080,b=vram[patternTableAddress+(l<<3)+f&patternTableAddressMask];paintPattern8(e,b,c,d),e+=8}e-=rightScrollPixels+256,renderSpritesLineMode1(a,e),leftMask&&paintBackdrop8(e),rightScrollPixels&&paintBackdrop8(e+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function renderLineModeG3PatInfo(){var a=getRealLine();if(!videoDisplayed)return renderSpritesLineMode2(a,0,colorPaletteReal);paintBackdrop16(bufferPosition),paintBackdrop16(bufferPosition+256);var b,c,d,e=bufferPosition+8+horizontalAdjust+rightScrollPixels,f=7&a,g=(192&a)<<2,h=layoutTableAddress+(a>>>3<<5),i=h+leftScrollCharsInPage;leftScroll2Pages&&leftScrollChars<32&&(i&=modeData.evenPageMask);for(var j=leftScrollCharsInPage?32-leftScrollCharsInPage:-1,k=0;k<32;++k){k===j&&(i=leftScroll2Pages&&leftScrollChars>=32?h&modeData.evenPageMask:h);var l=vram[i]|g;if(++i,debugModePatternInfoNames)l&=255,c=0===l||32===l?4293787648:4294967295,d=4278190080,b=vram[DEBUG_PAT_DIGI8_TABLE_ADDRESS+(l<<3)+f];else if(debugModePatternInfoBlocks){var m=vram[colorTableAddress+(l<<3)+f&colorTableAddressMask];c=colorPalette[m>>>4],d=colorPalette[15&m],b=vram[DEBUG_PAT_BLOCK_TABLE_ADDRESS+f]}else c=4294967295,d=4278190080,b=vram[patternTableAddress+(l<<3)+f&patternTableAddressMask];paintPattern8(e,b,c,d),e+=8}e-=rightScrollPixels+256,renderSpritesLineMode2(a,e,colorPaletteReal),leftMask&&paintBackdrop8(e),rightScrollPixels&&paintBackdrop8(e+256),renderWidth>500&&stretchCurrentLine(),bufferPosition+=bufferLineAdvance}function paintPattern6(a,b,c,d){frameBackBuffer[a]=128&b?c:d,frameBackBuffer[++a]=64&b?c:d,frameBackBuffer[++a]=32&b?c:d,frameBackBuffer[++a]=16&b?c:d,frameBackBuffer[++a]=8&b?c:d,frameBackBuffer[++a]=4&b?c:d}function paintPattern6a(a,b,c,d){for(var e=6;e>0;--e,++a)frameBackBuffer[a]=b>>e&4?c:d}function paintPattern8(a,b,c,d){frameBackBuffer[a]=128&b?c:d,frameBackBuffer[++a]=64&b?c:d,frameBackBuffer[++a]=32&b?c:d,frameBackBuffer[++a]=16&b?c:d,frameBackBuffer[++a]=8&b?c:d,frameBackBuffer[++a]=4&b?c:d,frameBackBuffer[++a]=2&b?c:d,frameBackBuffer[++a]=1&b?c:d}function paintBackdrop8(a){frameBackBuffer[a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue}function paintBackdrop16(a){frameBackBuffer[a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue}function paintBackdrop20(a){frameBackBuffer[a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue}function paintBackdrop32(a){frameBackBuffer[a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue, frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue}function paintBackdrop16Tiled(a){var b=backdropTileOdd,c=backdropTileEven;frameBackBuffer[a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c}function paintBackdrop32Tiled(a){var b=backdropTileOdd,c=backdropTileEven;frameBackBuffer[a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c,frameBackBuffer[++a]=b,frameBackBuffer[++a]=c}function renderSpritesLineMode1(a,b){if(!debugModeSpritesHidden&&208!==vram[spriteAttrTableAddress]){var c,d,e,f,g,h,i,j,k,l,m=spritesSize<=m)){if(++o>4&&(spritesInvalid<0&&!F&&(spritesInvalid=n),spriteDebugModeLimit))return;d=vram[c+3],(isV9918||0!=(15&d)||color0Solid)&&(j=vram[c+1],128&d&&(j-=32)<=-m||(d&=15,16===spritesSize?(e=debugModeSpriteInfoNumbers?n<<2:252&vram[c+2],f=spritePatternTableAddress+(e<<3)+(i>>>spritesMag),g=vram[f]<<8|vram[f+16]):(e=debugModeSpriteInfoNumbers?n:vram[c+2],g=vram[spritePatternTableAddress+(e<<3)+(i>>>spritesMag)]),k=j<=256-m?0:j-(256-m),l=j>=0?m:m+j,j+=m-l,paintSpriteMode1(j,a,b+j,spritesGlobalPriority+n,g,d,k,l,spritesMag,spriteDebugModeCollisions&&o<5)))}spritesInvalid<0&&n>spritesMaxComputed&&(spritesMaxComputed=n)}}function paintSpriteMode1(a,b,c,d,e,f,g,h,i,j){for(var k=h-1;k>=g;--k,++a,++c){0!==(e>>>(k>>>i)&1)&&(spritesLinePriorities[a]=p)){if(++s>8&&(spritesInvalid<0&&!F&&(spritesInvalid=q),spriteDebugModeLimit))return;if(k>>>=spritesMag,f=vram[e+k],o=64&f){if(r===SPRITE_MAX_PRIORITY||debugModeSpriteInfo)continue}else r=spritesGlobalPriority+q;(0!=(15&f)||color0Solid)&&(l=vram[d+1],128&f&&(l-=32)<=-p||(16===spritesSize?(g=debugModeSpriteInfoNumbers?q<<2:252&vram[d+2],h=spritePatternTableAddress+(g<<3)+k,i=vram[h]<<8|vram[h+16]):(g=debugModeSpriteInfoNumbers?q:vram[d+2],i=vram[spritePatternTableAddress+(g<<3)+k]),m=l<=256-p?0:l-(256-p),n=l>=0?p:p+l,l+=p-n,o?paintSpriteMode2CC(l,b+l,r,i,15&f,c,m,n,spritesMag):paintSpriteMode2(l,a,b+l,r,i,15&f,c,m,n,spritesMag,spriteDebugModeCollisions&&0==(32&f)&&s<9)))}spritesInvalid<0&&q>spritesMaxComputed&&(spritesMaxComputed=q)}}function paintSpriteMode2(a,b,c,d,e,f,g,h,i,j,k){for(var l=i-1;l>=h;--l,++a,++c){0!==(e>>>(l>>>j)&1)&&(spritesLinePriorities[a]=g;--k,++a,++b){if(0!==(d>>>(k>>>i)&1)){var l=spritesLinePriorities[a];l=o)){if(++r>8&&(spritesInvalid<0&&!F&&(spritesInvalid=p),spriteDebugModeLimit))return;if(j>>>=spritesMag,e=vram[d+j],n=64&e){if(q===SPRITE_MAX_PRIORITY||debugModeSpriteInfo)continue}else q=spritesGlobalPriority+p;(0!=(15&e)||color0Solid)&&(k=vram[c+1],128&e&&(k-=32)<=-o||(16===spritesSize?(f=debugModeSpriteInfoNumbers?p<<2:252&vram[c+2],g=spritePatternTableAddress+(f<<3)+j,h=vram[g]<<8|vram[g+16]):(f=debugModeSpriteInfoNumbers?p:vram[c+2],h=vram[spritePatternTableAddress+(f<<3)+j]),l=k<=256-o?0:k-(256-o),m=k>=0?o:o+k,k+=o-m,n?paintSpriteMode2TiledCC(k,b+(k<<1),q,h,15&e,l,m,spritesMag):paintSpriteMode2Tiled(k,a,b+(k<<1),q,h,15&e,l,m,spritesMag,spriteDebugModeCollisions&&0==(32&e)&&r<9)))}spritesInvalid<0&&p>spritesMaxComputed&&(spritesMaxComputed=p)}}function paintSpriteMode2Tiled(a,b,c,d,e,f,g,h,i,j){for(var k=h-1;k>=g;--k,++a,c+=2){0!==(e>>>(k>>>i)&1)&&(spritesLinePriorities[a]>>2],frameBackBuffer[c+1]=colorPaletteReal[3&f]))}}function paintSpriteMode2TiledCC(a,b,c,d,e,f,g,h){for(var i,j=g-1;j>=f;--j,++a,b+=2){if(0!==(d>>>(j>>>h)&1)){var k=spritesLinePriorities[a];k>>2],frameBackBuffer[b+1]=colorPaletteReal[3&i])}}}function renderSpritesLineMode2Stretched(a,b){if(spritesEnabled&&216!==vram[spriteAttrTableAddress+512]){var c,d,e,f,g,h,i,j,k,l,m,n,o=spritesSize<=o)){if(++r>8&&(spritesInvalid<0&&!F&&(spritesInvalid=p),spriteDebugModeLimit))return;if(j>>>=spritesMag,e=vram[d+j],n=64&e){if(q===SPRITE_MAX_PRIORITY||debugModeSpriteInfo)continue}else q=spritesGlobalPriority+p;(0!=(15&e)||color0Solid)&&(k=vram[c+1],128&e&&(k-=32)<=-o||(16===spritesSize?(f=debugModeSpriteInfoNumbers?p<<2:252&vram[c+2],g=spritePatternTableAddress+(f<<3)+j,h=vram[g]<<8|vram[g+16]):(f=debugModeSpriteInfoNumbers?p:vram[c+2],h=vram[spritePatternTableAddress+(f<<3)+j]),l=k<=256-o?0:k-(256-o),m=k>=0?o:o+k,k+=o-m, n?paintSpriteMode2StretchedCC(k,b+(k<<1),q,h,15&e,l,m,spritesMag):paintSpriteMode2Stretched(k,a,b+(k<<1),q,h,15&e,l,m,spritesMag,spriteDebugModeCollisions&&0==(32&e)&&r<9)))}spritesInvalid<0&&p>spritesMaxComputed&&(spritesMaxComputed=p)}}function paintSpriteMode2Stretched(a,b,c,d,e,f,g,h,i,j){for(var k=h-1;k>=g;--k,++a,c+=2){0!==(e>>>(k>>>i)&1)&&(spritesLinePriorities[a]=f;--j,++a,b+=2){if(0!==(d>>>(j>>>h)&1)){var k=spritesLinePriorities[a];k=0||(spritesCollisionX=a+12,spritesCollisionY=b+8,0==(192®ister[8])&&(status[3]=255&spritesCollisionX,status[4]=254|spritesCollisionX>>>8,status[5]=255&spritesCollisionY,status[6]=252|spritesCollisionY>>>8))}function stretchCurrentLine(){for(var a=bufferPosition+272-1,b=bufferPosition+544-2,c=272;c>0;--c,--a,b-=2)frameBackBuffer[b]=frameBackBuffer[b+1]=frameBackBuffer[a]}function stretchFromCurrentToTopScanline(){for(var a=bufferPosition,b=currentScanline;b>=startingVisibleTopBorderScanline;--b,a-=bufferLineAdvance)for(var c=a+272-1,d=a+544-2,e=272;e>0;--e,--c,d-=2)frameBackBuffer[d]=frameBackBuffer[d+1]=frameBackBuffer[c]}function cleanFrameBuffer(){wmsx.Util.arrayFill(frameBackBuffer,modeData.tiled?4278190080:backdropValue)}function refresh(){videoSignal.newFrame(frameCanvas,0,0,refreshWidth,refreshHeight),refreshWidth=refreshHeight=0}function beginFrame(){vSyncConnection.vSyncPulse(),framePulldown!==pulldown&&(frameVideoStandard=videoStandard,framePulldown=pulldown,updateSignalMetrics(!1)),currentScanline=0,frameStartingActiveScanline=startingActiveScanline,renderMetricsChangePending&&updateRenderMetrics(!0),!blinkPerLine&&blinkPageDuration>0&&clockPageBlinking(),EO^=1,!isV9918&&8®ister[9]?(bufferPosition=EO?LINE_WIDTH:0,bufferLineAdvance=2*LINE_WIDTH):(bufferPosition=0,bufferLineAdvance=LINE_WIDTH),updateLayoutTableAddressMask()}function finishFrame(){videoDisplayed&&(refreshWidth=renderWidth,refreshHeight=renderHeight,frameContext.putImageData(frameImageData,0,0,0,0,refreshWidth,refreshHeight)),++frame,beginFrame()}function initRegisters(){wmsx.Util.arrayFill(register,0),wmsx.Util.arrayFill(status,0),register[9]=videoStandard===wmsx.VideoStandard.PAL?2:0,status[0]=0,F=0,status[1]=isV9958?4:0,FH=0,status[2]=12,VR=0,HR=0,EO=0,status[4]=254,status[6]=252,status[9]=254}function initFrameResources(a){(!frameCanvas||!frameContextUsingAlpha&&a)&&(frameContextUsingAlpha=!!a,frameCanvas=document.createElement("canvas"),frameCanvas.width=wmsx.VDP.SIGNAL_MAX_WIDTH_V9938,frameCanvas.height=wmsx.VDP.SIGNAL_MAX_HEIGHT_V9938,frameContext=frameCanvas.getContext("2d",{alpha:frameContextUsingAlpha,antialias:!1}),frameImageData||(frameImageData=frameContext.createImageData(frameCanvas.width,frameCanvas.height+1+1),frameBackBuffer=new Uint32Array(frameImageData.data.buffer,0,frameCanvas.width*(frameCanvas.height+1)),backdropLineCache=new Uint32Array(frameImageData.data.buffer,frameCanvas.width*(frameCanvas.height+1)*4,frameCanvas.width)))}function initColorCaches(){colorsV9918Values=wmsx.ColorCache.getColors4bit9918Values(),colors8bitValues=wmsx.ColorCache.getColors8bit9938Values(),colors9bitValues=wmsx.ColorCache.getColors9bit9938Values(),colorsYJKValues=void 0}function initColorPalette(){for(var a=0;a<16;++a){paletteRegister[a]=paletteRegisterInitialValuesV9938[a];var b=isV9918?colorsV9918Values[a]:getColorValueForPaletteValue(paletteRegister[a]);colorPaletteReal[a]=b,debugModeSpriteHighlight&&(b&=DEBUG_DIM_ALPHA_MASK),colorPalette[a]=b,colorPaletteSolid[a]=b}updateBackdropValue()}function initDebugPatternTables(){for(var a=[["111","101","101","101","111"],["110","010","010","010","111"],["111","001","111","100","111"],["111","001","111","001","111"],["101","101","111","001","001"],["111","100","111","001","111"],["111","100","111","101","111"],["111","001","001","001","001"],["111","101","111","101","111"],["111","101","111","001","001"],["110","001","111","101","111"],["100","100","111","101","110"],["000","111","100","100","111"],["001","001","111","101","111"],["110","101","111","100","011"],["011","100","110","100","100"]],b=DEBUG_PAT_DIGI6_TABLE_ADDRESS,c=DEBUG_PAT_DIGI8_TABLE_ADDRESS,d=DEBUG_PAT_DIGI16_TABLE_ADDRESS,e=DEBUG_PAT_BLOCK_TABLE_ADDRESS,f=0;f<256;f++){for(var g=f/16|0,h=f%16,i=0;i<5;i++)vram[b++]=parseInt(a[g][i]+a[h][i]+"00",2),vram[c++]=parseInt(a[g][i]+"0"+a[h][i]+"0",2);for(vram[b++]=vram[c++]=parseInt("00000000",2),vram[b++]=vram[c++]=parseInt("01111100",2),vram[b++]=vram[c++]=parseInt("00000000",2),vram[d++]=parseInt("11111111",2),i=0;i<4;i++)vram[d++]=parseInt("10000000",2);for(i=0;i<5;i++)vram[d++]=parseInt("1000"+a[g][i]+"0",2);for(i=0;i<5;i++)vram[d++]=parseInt("10000000",2);for(i=0;i<2;i++)vram[d++]=parseInt("11111111",2);for(i=0;i<4;i++)vram[d++]=parseInt("00000001",2);for(i=0;i<5;i++)vram[d++]=parseInt("0"+a[h][i]+"0001",2);for(i=0;i<5;i++)vram[d++]=parseInt("00000001",2);vram[d++]=parseInt("11111111",2)}vram[e]=vram[e+7]=0,vram[e+1]=vram[e+2]=vram[e+3]=vram[e+4]=vram[e+5]=vram[e+6]=126}function initSpritesConflictMap(){wmsx.Util.arrayFill(spritesLinePriorities,SPRITE_MAX_PRIORITY),wmsx.Util.arrayFill(spritesLineColors,0),spritesGlobalPriority=SPRITE_MAX_PRIORITY}function logInfo(a){console.log("VDP "+a+", currentScanLine: "+currentScanline+", activeRenderScanline: "+(currentScanline-frameStartingActiveScanline)+", activeHeight: "+signalActiveHeight)}var self=this;this.setMachineType=function(a){var b=WMSX.VDP_TYPE>0?WMSX.VDP_TYPE:a;isV9918=b<=M_TYPES.MSX1,isV9938=b===M_TYPES.MSX2,isV9958=b>=M_TYPES.MSX2P,cpuBusClockPulses=cpu.busClockPulses,cpuMemoryRefresh=cpu.r800MemoryRefresh},this.connectBus=function(a){a.connectInputDevice(152,this.input98),a.connectOutputDevice(152,this.output98),a.connectInputDevice(153,this.input99),a.connectOutputDevice(153,this.output99),a.connectInputDevice(154,wmsx.DeviceMissing.inputPortIgnored),a.connectOutputDevice(154,this.output9a),a.connectInputDevice(155,wmsx.DeviceMissing.inputPortIgnored),a.connectOutputDevice(155,this.output9b)},this.connectSlave=function(a){slave=a,slave&&slave.setVideoStandard(videoStandard),updateSignalMetrics(!0),updateRenderMetrics(!0)},this.powerOn=function(){this.reset()},this.powerOff=function(){videoSignal.signalOff()},this.setVideoStandard=function(a){videoStandard=a,updateSynchronization(),slave&&slave.setVideoStandard(videoStandard)},this.setVSynchMode=function(a){vSynchMode=a,updateSynchronization()},this.getVideoSignal=function(){return videoSignal},this.getDesiredVideoPulldown=function(){return pulldown},this.videoClockPulse=function(){cycleEvents(),refreshWidth&&refresh(),slave&&slave.cycleEventRefresh()},this.input98=function(){dataFirstWrite=null;var a=dataPreRead;return dataPreRead=vram[vramPointer],++vramPointer,checkVRAMPointerWrap(),a},this.output98=function(a){dataFirstWrite=null,vram[vramPointer]=dataPreRead=a,++vramPointer,checkVRAMPointerWrap()},this.input99=function(){dataFirstWrite=null;var a,b=register[15];switch(b){case 0:a=getStatus0();break;case 1:a=status[1]|FH,16®ister[0]&&FH&&(FH=0,updateIRQ());break;case 2:commandProcessor.updateStatus(),a=status[2]|VR<<6|HR<<5|EO<<1;break;case 3:case 4:case 6:a=status[b];break;case 5:a=status[5],spritesCollisionX=spritesCollisionY=-1,status[3]=status[4]=status[5]=status[6]=0;break;case 7:a=status[7],commandProcessor.cpuRead();break;case 8:case 9:a=status[b];break;default:a=255}return a},this.output99=function(a){null===dataFirstWrite?(dataFirstWrite=a, isV9918&&(vramPointer=-256&vramPointer|a)):(128&a?isV9918?(registerWrite(7&a,dataFirstWrite),vramPointer=114943&vramPointer|(63&a)<<8):0==(64&a)&®isterWrite(63&a,dataFirstWrite):(vramPointer=114688&vramPointer|(63&a)<<8|dataFirstWrite,0==(64&a)&&(dataPreRead=vram[vramPointer],++vramPointer,checkVRAMPointerWrap())),dataFirstWrite=null)},this.output9a=function(a){isV9918||(null===paletteFirstWrite?paletteFirstWrite=a:(paletteRegisterWrite(register[16],a<<8|paletteFirstWrite,!1),++register[16]>15&&(register[16]=0),paletteFirstWrite=null))},this.output9b=function(a){if(!isV9918){var b=63®ister[17];17!==b&®isterWrite(b,a),0==(128®ister[17])&&(register[17]=b+1&63)}},this.toggleDebugModes=function(a){return setDebugMode(debugMode+(a?-1:1)),videoSignal.showOSD("Debug Mode"+(debugMode>0?" "+debugMode:"")+": "+["OFF","Sprites Highlighted","Sprite Numbers","Sprite Names","Sprites Hidden","Pattern Bits","Pattern Color Blocks","Pattern Names"][debugMode],!0),debugMode},this.toggleSpriteDebugModes=function(a){setSpriteDebugMode(spriteDebugMode+(a?-1:1)),videoSignal.showOSD("Sprites Mode"+(spriteDebugMode>0?" "+spriteDebugMode:"")+": "+["Normal","Unlimited","NO Collisions","Unlimited, No Collisions"][spriteDebugMode],!0)},this.setColorAndPaletteMode=function(a,b){wmsx.ColorCache.setColorAndPaletteMode(a,b),initColorCaches(),updateAllPaletteValues()},this.getSpriteDebugModeQuickDesc=function(){return["Normal","Unlimited","No Collis.","Both"][spriteDebugMode]},this.setVDPTurboMulti=function(a){commandProcessor.setVDPTurboMulti(a)},this.getVDPTurboMulti=function(){return commandProcessor.getVDPTurboMulti()},this.setDefaults=function(){setDebugMode(STARTING_DEBUG_MODE),setSpriteDebugMode(STARTING_SPRITES_DEBUG_MODE)},this.videoSignalDisplayStateUpdate=function(a,b){videoDisplayed=a},this.refreshDisplayMetrics=function(){videoSignal.setDisplayMetrics(renderWidth,renderHeight)},this.resetOutputAutoMode=function(){},this.reset=function(){frame=0,dataFirstWrite=null,dataPreRead=0,vramPointer=0,paletteFirstWrite=null,verticalAdjust=horizontalAdjust=0,leftMask=leftScroll2Pages=!1,leftScrollChars=leftScrollCharsInPage=rightScrollPixels=0,backdropColor=backdropValue=0,spritesCollided=!1,spritesCollisionX=spritesCollisionY=spritesInvalid=-1,spritesMaxComputed=0,horizontalIntLine=0,vramInterleaving=!1,renderMetricsChangePending=!1,refreshWidth=refreshHeight=0,frameVideoStandard=videoStandard,framePulldown=pulldown,currentScanline=-1,initRegisters(),initColorPalette(),commandProcessor.reset(),updateSignalMetrics(!0),updateIRQ(),updateMode(!0),updateSpritesConfig(),updateBackdropColor(),updateTransparency(),updateSynchronization(),updateBlinking(),beginFrame()},this.getVDPCycles=function(){return 6*cpu.getBUSCycles()},this.getScreenText=function(){var a=modeData.textCols;if(!a)return null;for(var b=128®ister[9]?27:24,c=[],d=0;d>6&1,HR=status[2]>>5&1,EO=status[2]>>1&1,status[0]&=-129,status[1]&=-2,status[2]&=-99),vramInterleaving=a.vrint,commandProcessor.loadState(a.cp),commandProcessor.connectVDP(this,vram,register,status),frameVideoStandard=videoStandard,framePulldown=pulldown,updateSignalMetrics(!0),void 0!==a.fs&&(frameStartingActiveScanline=a.fs),updateIRQ(),updateMode(!0),updateSpritesConfig(),updateAllPaletteValues(),updateBackdropColor(),updateTransparency(),a.ad?setActiveDisplay():setBorderDisplay(),void 0!==a.dm&&setDebugMode(a.dm),void 0!==a.sd&&setSpriteDebugMode(a.sd)},init(),this.logInfo=logInfo,this.eval=function(str){return eval(str)}},wmsx.VDP.VRAM_LIMIT=131071,wmsx.VDP.SIGNAL_WIDTH_V9918=272,wmsx.VDP.SIGNAL_HEIGHT_V9918=208,wmsx.VDP.SIGNAL_START_WIDTH_V9938=272,wmsx.VDP.SIGNAL_START_HEIGHT_V9938=228,wmsx.VDP.SIGNAL_MAX_WIDTH_V9938=544,wmsx.VDP.SIGNAL_MAX_HEIGHT_V9938=456,wmsx.VDP.BASE_CLOCK=6*wmsx.CPU.BASE_CLOCK,wmsx.VDPCommandProcessor=function(){"use strict";function getSX(){return(1®ister[33])<<8|register[32]}function getSY(){return(3®ister[35])<<8|register[34]}function setSY(a){register[35]=a>>8&3,register[34]=255&a}function getDX(){return(1®ister[37])<<8|register[36]}function getDY(){return(3®ister[39])<<8|register[38]}function setDY(a){register[39]=a>>8&3,register[38]=255&a}function getNX(){return(1®ister[41])<<8|register[40]}function getNY(){return(3®ister[43])<<8|register[42]}function setNY(a){register[43]=a>>8&3,register[42]=255&a}function getDIX(){return 4®ister[45]?-1:1}function getDIY(){return 8®ister[45]?-1:1}function getCLR(){return register[44]}function setCLR(a){register[44]=a}function getMAJ(){return 1®ister[45]}function getEQ(){return 0==(2®ister[45])}function getLOP(){return LOGICAL_OPERATIONS[15®ister[46]]}function HMMC(){var a=getDX();DY=getDY(),NX=getNX(),NY=getNY(),DIX=getDIX(),DIY=getDIY(),a>>=modePPBShift,NX>>=modePPBShift,a>=layoutLineBytes?(a&=layoutLineBytes-1,NX=1):(NX=NX||layoutLineBytes,NX=1===DIX?min(NX,layoutLineBytes-a):min(NX,a+1)),NY=NY||1024,ENY=1===DIY?NY:min(NY,DY+1),destPos=DY*layoutLineBytes+a,writeStart(HMMCNextWrite)}function HMMCNextWrite(a){vram[destPos&VRAM_LIMIT]=a,++CX,CX>=NX?(destPos-=DIX*(NX-1),CX=0,++CY,CY>=ENY?finish():destPos+=DIY*layoutLineBytes):destPos+=DIX,setDY(DY+DIY*CY),setNY(NY-CY)}function YMMM(){var a=getSY(),b=getDX(),c=getDY(),d=getNY(),e=getDIX(),f=getDIY();(b>>=modePPBShift)>=layoutLineBytes&&(b&=layoutLineBytes-1);var g=1===e?layoutLineBytes-b:b+1;d=d||1024;for(var h=1===f?d:min(d,min(a,c)+1),i=a*layoutLineBytes+b,j=c*layoutLineBytes+b,k=-e*g+layoutLineBytes*f,l=h;l>0;--l){for(var m=g;m>0;--m)vram[j&VRAM_LIMIT]=vram[i&VRAM_LIMIT],i+=e,j+=e;i+=k,j+=k}setSY(a+f*h),setDY(c+f*h),setNY(d-h),start(g*h,64,h,0)}function HMMM(){var a=getSX(),b=getSY(),c=getDX(),d=getDY(),e=getNX(),f=getNY(),g=getDIX(),h=getDIY();a>>=modePPBShift,c>>=modePPBShift,e>>=modePPBShift,a>=layoutLineBytes||c>=layoutLineBytes?(a&=layoutLineBytes-1,c&=layoutLineBytes-1,e=1):(e=e||layoutLineBytes,e=1===g?min(e,layoutLineBytes-max(a,c)):min(e,min(a,c)+1)),f=f||1024;for(var i=1===h?f:min(f,min(b,d)+1),j=b*layoutLineBytes+a,k=d*layoutLineBytes+c,l=-g*e+layoutLineBytes*h,m=i;m>0;--m){for(var n=e;n>0;--n)vram[k&VRAM_LIMIT]=vram[j&VRAM_LIMIT],j+=g,k+=g;j+=l,k+=l}setSY(b+h*i),setDY(d+h*i),setNY(f-i),start(e*i,88,i,64)}function HMMV(){var a=getDX(),b=getDY(),c=getNX(),d=getNY(),e=getCLR(),f=getDIX(),g=getDIY();a>>=modePPBShift,c>>=modePPBShift,a>=layoutLineBytes?(a&=layoutLineBytes-1,c=1):(c=c||layoutLineBytes,c=1===f?min(c,layoutLineBytes-a):min(c,a+1)),d=d||1024;for(var h=1===g?d:min(d,b+1),i=b*layoutLineBytes+a,j=-f*c+layoutLineBytes*g,k=h;k>0;--k){for(var l=c;l>0;--l)vram[i&VRAM_LIMIT]=e,i+=f;i+=j}setDY(b+g*h),setNY(d-h),start(c*h,48,h,56)}function LMMC(){DX=getDX(),DY=getDY(),NX=getNX(),NY=getNY(),DIX=getDIX(),DIY=getDIY(),LOP=getLOP(),DX>=modeWidth?(DX&=modeWidth-1, NX=1):(NX=NX||modeWidth,NX=1===DIX?min(NX,modeWidth-DX):min(NX,DX+1)),NY=NY||1024,ENY=1===DIY?NY:min(NY,DY+1),writeStart(LMMCNextWrite)}function LMMCNextWrite(a){logicalPSET(DX,DY,a,LOP),++CX,CX>=NX?(DX-=DIX*(NX-1),CX=0,++CY,DY+=DIY,CY>=ENY&&finish()):DX+=DIX,setDY(DY),setNY(NY-CY)}function LMCM(){SX=getSX(),SY=getSY(),NX=getNX(),NY=getNY(),DIX=getDIX(),DIY=getDIY(),SX>=modeWidth?(SX&=modeWidth-1,NX=1):(NX=NX||modeWidth,NX=1===DIX?min(NX,modeWidth-SX):min(NX,SX+1)),NY=NY||1024,ENY=1===DIY?NY:min(NY,SY+1),readStart(LMCMNextRead)}function LMCMNextRead(){status[7]=normalPGET(SX,SY),++CX,CX>=NX?(SX-=DIX*(NX-1),CX=0,++CY,SY+=DIY,CY>=ENY&&finish()):SX+=DIX,setSY(SY),setNY(NY-CY)}function LMMM(){var a=getSX(),b=getSY(),c=getDX(),d=getDY(),e=getNX(),f=getNY(),g=getDIX(),h=getDIY(),i=getLOP();a>=modeWidth||c>=modeWidth?(a&=modeWidth-1,c&=modeWidth-1,e=1):(e=e||modeWidth,e=1===g?min(e,modeWidth-max(a,c)):min(e,min(a,c)+1)),f=f||1024;for(var j=1===h?f:min(f,min(b,d)+1),k=j;k>0;--k){for(var l=e;l>0;--l)logicalPCOPY(c,d,a,b,i),a+=g,c+=g;a-=g*e,c-=g*e,b+=h,d+=h}setSY(b),setDY(d),setNY(f-j),start(e*j,120,j,64)}function LMMV(){var a=getDX(),b=getDY(),c=getNX(),d=getNY(),e=getCLR(),f=getDIX(),g=getDIY(),h=getLOP();a>=modeWidth?(a&=modeWidth-1,c=1):(c=c||modeWidth,c=1===f?min(c,modeWidth-a):min(c,a+1)),d=d||1024;for(var i=1===g?d:min(d,b+1),j=i;j>0;--j){for(var k=c;k>0;--k)logicalPSET(a,b,e,h),a+=f;a-=f*c,b+=g}setDY(b),setNY(d-i),start(c*i,96,i,64)}function LINE(){var a=getDX(),b=getDY(),c=getNX(),d=getNY(),e=getCLR(),f=getDIX(),g=getDIY(),h=getMAJ(),i=getLOP(),j=modeWidth-1;a&=j;var k=0,l=0;if(0===h)for(var m=0;m<=c&&(logicalPSET(a,b,e,i),a+=f,d>0&&(l+=d)<<1>=c&&(b+=g,l-=c,++k),!(a>j||a<0||b<0));++m);else for(m=0;m<=c&&(logicalPSET(a,b,e,i),b+=g,d>0&&(l+=d)<<1>=c&&(a+=f,l-=c,++k),!(a>j||a<0||b<0));++m);setDY(b),start(m,112,k,32)}function SRCH(){var a=getSX(),b=getSY(),c=getCLR(),d=getDIX(),e=getEQ();a>=modeWidth&&(a&=modeWidth-1);var f=1===d?modeWidth:-1,g=a,h=!1;if(e)do{if(normalPGET(g,b)===c){h=!0;break}g+=d}while(g!==f);else do{if(normalPGET(g,b)!==c){h=!0;break}g+=d}while(g!==f);status[2]=-17&status[2]|(h?16:0),status[8]=255&g,status[9]=g>>8&1,start(Math.abs(g-a)+1,86,1,50)}function PSET(){var a=getDX(),b=getDY(),c=getCLR(),d=getLOP();a>=modeWidth&&(a&=modeWidth-1),logicalPSET(a,b,c,d),start(0,0,1,40)}function POINT(){var a=getSX(),b=getSY();a>=modeWidth&&(a&=modeWidth-1);var c=normalPGET(a,b);setCLR(c),status[7]=c,start(0,0,1,40)}function STOP(){finish()}function normalPGET(a,b){var c,d;switch(modePPB){case 2:c=1&a?0:4,a>>>=1,d=15<>>=2,d=3<>c}function logicalPSET(a,b,c,d){var e,f;switch(modePPB){case 2:e=1&a?0:4,a>>>=1,c=(15&c)<>>=2,c=(3&c)<>>=1,a>>>=1,h=15;break;case 4:f=2*(3-(3&c)),g=2*(3-(3&a)),c>>>=2,a>>>=2,h=3;break;default:f=g=0,h=255}var i=d*layoutLineBytes+c,j=b*layoutLineBytes+a,k=(vram[i&VRAM_LIMIT]>>f&h)<b?a:b}function start(a,b,c,d,e){CE=1,writeHandler=null,readHandler=null,estimateDuration(a,b,c,d,e)}function estimateDuration(a,b,c,d,e){if(e)finishingCycle=-1;else if(0===turboClockMulti)finishingCycle=0;else{var f=(a*b*COMMAND_PER_PIXEL_DURATION_FACTOR+c*d)/turboClockMulti|0;finishingCycle=vdp.getVDPCycles()+f}}function writeStart(a){start(0,0,0,0,!0),CX=0,CY=0,writeHandler=a,TR=1,writeReady&&(writeHandler(getCLR()),writeReady=!1)}function readStart(a){start(0,0,0,0,!0),CX=0,CY=0,readHandler=a,TR=1,readHandler()}function finish(){CE=0,writeHandler=null,writeReady=!1,readHandler=null,register[46]&=-241}this.connectVDP=function(a,b,c,d){vdp=a,vram=b,register=c,status=d},this.reset=function(){STOP()},this.startCommand=function(a){switch(240&a){case 240:HMMC();break;case 224:YMMM();break;case 208:HMMM();break;case 192:HMMV();break;case 176:LMMC();break;case 160:LMCM();break;case 144:LMMM();break;case 128:LMMV();break;case 112:LINE();break;case 96:SRCH();break;case 80:PSET();break;case 64:POINT();break;case 0:STOP()}},this.cpuWrite=function(a){writeHandler?writeHandler(a):(writeReady=!0,TR=0)},this.cpuRead=function(){readHandler?readHandler():TR=0},this.updateStatus=function(){CE&&finishingCycle>=0&&(0===finishingCycle||vdp.getVDPCycles()>=finishingCycle)&&finish(),status[2]=-130&status[2]|TR<<7|CE},this.setVDPModeData=function(a){modeData=a,modeWidth=modeData.width,modePPB=modeData.ppb||1,modePPBShift=modePPB>>1,modePPBMask=-1<8?0:a},this.getVDPTurboMulti=function(){return turboClockMulti};var VRAM_LIMIT=wmsx.VDP.VRAM_LIMIT,COMMAND_HANDLERS={HMMCNextWrite:HMMCNextWrite,LMMCNextWrite:LMMCNextWrite,LMCMNextRead:LMCMNextRead},COMMAND_PER_PIXEL_DURATION_FACTOR=1.1,LOGICAL_OPERATIONS=[lopIMP,lopAND,lopOR,lopXOR,lopNOT,lopIMP,lopIMP,lopIMP,lopTIMP,lopTAND,lopTOR,lopTXOR,lopTNOT,lopIMP,lopIMP,lopIMP],turboClockMulti=1,vdp,vram,register,status,CE=!1,TR=!1,SX,SY,DX,DY,NX,NY,ENY,DIX,DIY,CX,CY,LOP,destPos,writeReady=!1,writeHandler=null,readHandler=null,finishingCycle=0,modeData,modePPB,modePPBShift,modePPBMask,modeWidth,layoutLineBytes;this.saveState=function(){return{ce:CE,tr:TR,wr:writeReady,wh:writeHandler&&writeHandler.name,rh:readHandler&&readHandler.name,fc:finishingCycle,SX:SX,SY:SY,DX:DX,DY:DY,NX:NX,NY:NY,ENY:ENY,DIX:DIX,DIY:DIY,CX:CX,CY:CY,LOP:LOP&&LOGICAL_OPERATIONS.indexOf(LOP),dp:destPos,tcm:turboClockMulti}},this.loadState=function(a){CE=a.ce,TR=a.tr,writeReady=a.wr,writeHandler=COMMAND_HANDLERS[a.wh],readHandler=COMMAND_HANDLERS[a.rh],finishingCycle=a.fc,SX=a.SX,SY=a.SY,DX=a.DX,DY=a.DY,NX=a.NX,NY=a.NY,ENY=a.ENY,DIX=a.DIX,DIY=a.DIY,CX=a.CX,CY=a.CY,LOP=a.LOP>=0?LOGICAL_OPERATIONS[a.LOP]:void 0,destPos=a.dp,turboClockMulti=void 0!==a.tcm?a.tcm:1},this.eval=function(str){return eval(str)}},wmsx.V9990=function(){"use strict";function init(){videoSignal=new wmsx.VideoSignal(self,"V9990"),initColorCaches(),initFrameResources(!1),initDebugPatternTables(),modeData=modes.SBY,typeData=types.SBY,self.setDefaults(),commandProcessor=new wmsx.V9990CommandProcessor,commandProcessor.connectV9990(self,vram,register),commandProcessor.setV9990ModeData(modeData,typeData,imageWidth,imageHeight)}function softReset(){interruptFlags=0,vramPointerRead=0,vramPointerWrite=0,vramPointerReadInc=!0,vramPointerWriteInc=!0,vramReadData=0,palettePointer=0,palettePointerReadInc=!0,paletteOffsetA=0,paletteOffsetB=0,paletteOffset=0,scrollXOffset=0,scrollYOffset=0,scrollYOffsetFrame=0,scrollXBOffset=0,scrollYBOffset=0,scrollYBOffsetFrame=0,scrollYMax=0,scrollYHiUpdatePending=!1,scrollYBHiUpdatePending=!1,planeAEnabled=!0,planeBEnabled=!0,priBYLine=256,priBXCol=256,vramEOLineShift=0,vramEOLineAdd=0,verticalAdjust=horizontalAdjust=0,dispEnabled=!1,dispAndSpritesUpdatePending=!1,spritesEnabled=!0,horizontalIntLine=0,renderMetricsUpdatePending=!1,commandProcessor.reset(),initRegisters(),updateIRQ(),updateMode(!0),updateBackdropColor(),updateSynchronization(),commandProcessor.setV9990DisplayAndSpritesEnabled(dispEnabled,spritesEnabled),updateYSEnabled()}function updateVRAMReadPointer(){ vramPointerRead=(register[5]<<16|register[4]<<8|register[3])&VRAM_LIMIT,vramPointerReadInc=0==(128®ister[5])}function updateVRAMWritePointer(a){vramPointerWrite=(register[2]<<16|register[1]<<8|register[0])&VRAM_LIMIT,vramPointerWriteInc=0==(128®ister[2])}function updatePalettePointer(){palettePointer=register[14]}function updatePalettePointerReadInc(){palettePointerReadInc=0==(16®ister[13])}function updatePaletteOffsets(){paletteOffsetA=(3®ister[13])<<4,paletteOffsetB=(12®ister[13])<<2,paletteOffset=paletteOffsetB<<2|paletteOffsetA}function updatePaletteOffsetCursor(){paletteOffsetCursor=(15®ister[28])<<2}function updateYSEnabled(a){var b=superimposeActive&&0!=(32®ister[8]),c=b?65535:32767;(a||ys16BitColorMask!==c)&&(ys16BitColorMask=c,updateAllPaletteValues(),colors8bitValues&&(colors8bitValues=wmsx.ColorCache.getColors8bit9990Values(b)))}function updateVRAMSize(){var a=3®ister[8];a<2&&console.warn("Unsupported: V9990 Setting VRAM size < 512K !:",a)}function paletteRAMWrite(a,b){b!==paletteRAM[a]&&(paletteRAM[a]=b,updatePaletteValue(a>>2))}function registerWrite(a,b){var c=register[a]^b;switch(register[a]=b®_WRITE_MASK[a],a){case 0:case 1:case 2:updateVRAMWritePointer(a);break;case 3:case 4:updateVRAMReadPointer();break;case 5:updateVRAMReadPointer(),self.input60();break;case 6:240&c?updateMode():195&c?updateType():12&c&&updateImageSize();break;case 7:8&c&&updateVideoStandardSoft(),65&c?updateMode():2&c&&updateRenderMetrics();break;case 8:192&c&&(dispAndSpritesUpdatePending=!0),32&c&&updateYSEnabled(),3&c&&updateVRAMSize();break;case 9:7&c&&updateIRQ();break;case 10:c&&updateHorizontalIntLine();break;case 11:3&c&&updateHorizontalIntLine();break;case 12:15&c&&updateHorizontalIntX();break;case 13:224&c&&updateType(),16&c&&updatePalettePointerReadInc(),15&c&&updatePaletteOffsets();break;case 14:updatePalettePointer();break;case 15:63&c&&updateBackdropColor();break;case 16:15&c&&(horizontalAdjust=(15&b^7)-7),240&c&&(verticalAdjust=(b>>>4^7)-7,updateSignalMetrics(!1));break;case 17:updateScrollYLow();break;case 18:31&c&&(scrollYHiUpdatePending=!0),192&c&&updateScrollYMax();break;case 19:case 20:c&&updateScrollX();break;case 21:updateScrollYBLow();break;case 22:1&c&&(scrollYBHiUpdatePending=!0),192&c&&updatePlanesEnabled();break;case 23:case 24:c&&updateScrollXB();break;case 25:15&c&&updateSpritePattAddress();break;case 26:break;case 27:15&c&&updatePriorities();break;case 28:15&c&&updatePaletteOffsetCursor();break;case 52:commandProcessor.startCommand(b)}}function updateAllPaletteValues(){for(var a=63;a>=0;--a)updatePaletteValue(a)}function updatePaletteValue(a){var b=a<<2,c=ys16BitColorMask&((128&paletteRAM[b])<<8|(31&paletteRAM[b+1])<<10|(31&paletteRAM[b])<<5|31&paletteRAM[b+2]),d=colors16bitValues[c];paletteValuesReal[a]=d,debugModeSpriteHighlight&&(d&=DEBUG_DIM_ALPHA_MASK),paletteValues[a]=d,a===backdropColor&&updateBackdropValue()}function updateSynchronization(){pulldown=1===vSynchMode?videoStandard.pulldowns[machine.getVideoClockSocket().getVSynchNativeFrequency()]||videoStandard.pulldowns.TIMER:videoStandard.pulldowns.TIMER}function triggerVerticalInterrupt(){1&interruptFlags||(interruptFlags|=1,updateIRQ())}function triggerHorizontalInterrupt(){2&interruptFlags||(interruptFlags|=2,updateIRQ())}function updateIRQ(){register[9]&interruptFlags?cpu.setINTChannel(1,0):cpu.setINTChannel(1,1)}function updateMode(a){var b;switch(register[6]>>6){case 3:b=modes.SBY;break;case 0:b=modes.P1;break;case 1:b=modes.P2;break;case 2:switch(1&systemControl){case 0:switch((48®ister[6])>>4){case 0:b=modes.B1;break;case 1:b=modes.B3;break;case 2:switch(65®ister[7]){case 1:b=modes.B5;break;case 65:b=modes.B6;break;case 0:case 64:b=modes.B7}}break;case 1:switch((48®ister[6])>>4){case 0:b=modes.B0;break;case 1:b=modes.B2;break;case 2:b=modes.B4}}}modeData=b||modes.SBY,updateType(),updateSpritePattAddress(),updateLineActiveType(),updateSignalMetrics(!1),updateRenderMetrics(a),updateVRAMInterleaving()}function updateType(){var a;switch(register[6]>>6){case 3:a=types.SBY;break;case 0:a=types.PP1;break;case 1:a=types.PP2;break;case 2:switch(3®ister[6]){case 0:a=types.BP2;break;case 1:a=types.BP4;break;case 3:a=types.BD16;break;case 2:switch(register[13]>>6){case 0:a=types.BP6;break;case 1:a=types.BD8;break;case 2:case 3:switch(register[13]>>5){case 4:a=types.BYJK;break;case 5:a=types.BYJKP;break;case 6:a=types.BYUV;break;case 7:a=types.BYUVP}}}}typeData=a||types.SBY,updateImageSize()}function updateImageSize(){modeData===modes.P1?(imageWidth=256,imageHeight=2048):modeData===modes.P2?(imageWidth=512,imageHeight=2048):(imageWidth=256<<((12®ister[6])>>2),imageHeight=VRAM_SIZE/(imageWidth*typeData.bpp>>3)),updateScrollYMax(),commandProcessor.setV9990ModeData(modeData,typeData,imageWidth,imageHeight)}function updateScrollYLow(){scrollYOffset=7936&scrollYOffset|register[17],scrollYOffsetFrame=currentScanline>frameStartingActiveScanline?scrollYOffset-(currentScanline-frameStartingActiveScanline):scrollYOffset,scrollYHiUpdatePending=!0}function updateScrollYHigh(){scrollYOffsetFrame=scrollYOffset=(31®ister[18])<<8|255&scrollYOffset,scrollYHiUpdatePending=!1}function updateScrollX(){scrollXOffset=register[19]|register[20]<<3}function updateScrollYMax(){scrollYMax=128®ister[18]?511:64®ister[18]?255:modeData===modes.P1||modeData===modes.P2?511:imageHeight-1}function updateScrollYBLow(){scrollYBOffset=256&scrollYBOffset|register[21],scrollYBOffsetFrame=currentScanline>frameStartingActiveScanline?scrollYBOffset-(currentScanline-frameStartingActiveScanline):scrollYBOffset,scrollYBHiUpdatePending=!0}function updateScrollYBHigh(){scrollYBOffsetFrame=scrollYBOffset=(1®ister[22])<<8|255&scrollYBOffset,scrollYBHiUpdatePending=!1}function updateScrollXB(){scrollXBOffset=register[23]|register[24]<<3}function updatePlanesEnabled(){planeAEnabled=0==(128®ister[22]),planeBEnabled=0==(64®ister[22])}function updatePriorities(){priBYLine=(register[27]>>2&3)<<6,0===priBYLine&&(priBYLine=256),0===(priBXCol=(3®ister[27])<<6)&&(priBXCol=256)}function updateSpritePattAddress(){spritePattAddress=modeData===modes.P1?(14®ister[25])<<14:(15®ister[25])<<15}function updateHorizontalIntLine(){horizontalIntLine=(3®ister[11])<<8|register[10]}function updateHorizontalIntX(){debugMode&&(15®ister[12])>0&&logInfo("Unsupported: V9990 Horizontal INT X > 0 specified!")}function updateVideoStandardSoft(){var a=0!=(8®ister[7]);machine.setVideoStandardSoft(a?wmsx.VideoStandard.PAL:wmsx.VideoStandard.NTSC)}function updateSignalMetrics(a){signalActiveHeight=modeData.height;var b=8*modeData.hasBorders,c=verticalAdjust;startingVisibleTopBorderScanline=16-(16-b),startingActiveScanline=startingVisibleTopBorderScanline+b+c,startingInvisibleScanline=startingActiveScanline+signalActiveHeight+b-c,a&&(frameStartingActiveScanline=startingActiveScanline,frameDoubleScan=modeData.doublesScan)}function updateRenderMetrics(a){var b,c,d,e=!1,f=!1;b=modeData.width+8*modeData.hasBorders*2*modeData.pixelWidthDiv,d=modeData.allowIL&&2®ister[7]?2:1,c=(modeData.height+8*modeData.hasBorders*2)*d,renderMetricsUpdatePending=!1,b===renderWidth&&c===renderHeight||(b!==renderWidth&&(a?((currentScanline>=startingVisibleTopBorderScanline||b>renderWidth)&&(f=!0),renderWidth=b,e=!0):renderMetricsUpdatePending=!0),c!==renderHeight&&(a?((currentScanline>=startingVisibleTopBorderScanline||c>renderHeight)&&(f=!0),renderHeight=c,e=!0):renderMetricsUpdatePending=!0),f&&cleanFrameBuffer(),e&&self.refreshDisplayMetrics())}function enterActiveDisplay(){status&=-65,dispAndSpritesUpdatePending&&updateDispAndSpritesEnabled(),scrollYHiUpdatePending&&updateScrollYHigh(),scrollYBHiUpdatePending&&updateScrollYBHigh(),setActiveDisplay()}function setActiveDisplay(){renderLine=renderLineActive}function enterBorderDisplay(){status|=64,triggerVerticalInterrupt(),setBorderDisplay()} function setBorderDisplay(){renderLine=renderLineBackdrop}function updateDispAndSpritesEnabled(){var a=0!=(128®ister[8]);dispEnabled!==a&&(a&&cartridge.v9990DisplayEnabled(),dispEnabled=a),spritesEnabled=0==(64®ister[8]),updateLineActiveType(),commandProcessor.setV9990DisplayAndSpritesEnabled(dispEnabled,spritesEnabled),dispAndSpritesUpdatePending=!1}function updateLineActiveType(){var a=renderLine===renderLineActive;renderLineActive=modeData===modes.SBY?renderLineModeSBY:dispEnabled?modeData.renderLine:renderLineBackdrop,a&&(renderLine=renderLineActive)}function updateBackdropColor(){backdropColor=63®ister[15],updateBackdropValue()}function updateBackdropValue(){var a=debugModePatternInfo?debugBackdropValue:paletteValuesReal[backdropColor];backdropValue!==a&&(backdropValue=a,backdropCacheUpdatePending=!0)}function updateBackdropLineCache(){wmsx.Util.arrayFill(backdropLineCache,backdropValue),backdropCacheUpdatePending=!1}function renderLineBackdrop(){backdropCacheUpdatePending&&updateBackdropLineCache(),frameBackBuffer.set(backdropLineCache,bufferPosition),bufferPosition+=bufferLineAdvance}function paintBackdrop8(a){frameBackBuffer[a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue}function paintBackdrop16(a){frameBackBuffer[a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue}function paintBackdrop32(a){frameBackBuffer[a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue,frameBackBuffer[++a]=backdropValue}function paintBackdrop64(a){backdropCacheUpdatePending&&updateBackdropLineCache(),frameBackBuffer.set(backdrop64,a)}function paintBackdrop256(a){backdropCacheUpdatePending&&updateBackdropLineCache(),frameBackBuffer.set(backdrop256,a)}function paintBackdrop512(a){backdropCacheUpdatePending&&updateBackdropLineCache(),frameBackBuffer.set(backdrop512,a)}function renderLineModeSBY(){renderLineTypeSBY(bufferPosition),bufferPosition+=bufferLineAdvance}function renderLineModeP1(){renderLineTypePP1(bufferPosition+horizontalAdjust+8),paintBackdrop16(bufferPosition+horizontalAdjust-8),paintBackdrop16(bufferPosition+horizontalAdjust+8+256),bufferPosition+=bufferLineAdvance}function renderLineModeP2(){renderLineTypePP2(bufferPosition+(horizontalAdjust<<1)+16),paintBackdrop32(bufferPosition+(horizontalAdjust<<1)-16),paintBackdrop32(bufferPosition+(horizontalAdjust<<1)+16+512),bufferPosition+=bufferLineAdvance}function renderLineModeB0(){typeData.renderLine(bufferPosition+horizontalAdjust,192),paintBackdrop8(bufferPosition+horizontalAdjust-8),paintBackdrop8(bufferPosition+horizontalAdjust+192),bufferPosition+=bufferLineAdvance}function renderLineModeB1(){typeData.renderLine(bufferPosition+horizontalAdjust+8,256),paintBackdrop16(bufferPosition+horizontalAdjust-8),paintBackdrop16(bufferPosition+horizontalAdjust+8+256),bufferPosition+=bufferLineAdvance}function renderLineModeB2(){typeData.renderLine(bufferPosition+horizontalAdjust,384),paintBackdrop8(bufferPosition+horizontalAdjust-8),paintBackdrop8(bufferPosition+horizontalAdjust+384),bufferPosition+=bufferLineAdvance}function renderLineModeB3(){typeData.renderLine(bufferPosition+(horizontalAdjust<<1)+16,512),paintBackdrop32(bufferPosition+(horizontalAdjust<<1)-16),paintBackdrop32(bufferPosition+(horizontalAdjust<<1)+16+512),bufferPosition+=bufferLineAdvance}function renderLineModeB4(){typeData.renderLine(bufferPosition+(horizontalAdjust<<1),768),paintBackdrop16(bufferPosition+(horizontalAdjust<<1)-16),paintBackdrop16(bufferPosition+(horizontalAdjust<<1)+768),bufferPosition+=bufferLineAdvance}function renderLineModeB5(){typeData.renderLine(bufferPosition+(horizontalAdjust<<1),640),paintBackdrop16(bufferPosition+(horizontalAdjust<<1)-16),paintBackdrop16(bufferPosition+(horizontalAdjust<<1)+640),bufferPosition+=bufferLineAdvance}function renderLineModeB6(){typeData.renderLine(bufferPosition+(horizontalAdjust<<1),640),paintBackdrop16(bufferPosition+(horizontalAdjust<<1)-16),paintBackdrop16(bufferPosition+(horizontalAdjust<<1)+640),bufferPosition+=bufferLineAdvance}function renderLineModeB7(){typeData.renderLine(bufferPosition+(horizontalAdjust<<2)+32,1024),paintBackdrop64(bufferPosition+(horizontalAdjust<<2)-32),paintBackdrop64(bufferPosition+(horizontalAdjust<<2)+32+1024),bufferPosition+=bufferLineAdvance}function renderLineTypeSBY(a){frameBackBuffer.set(standByLineCache,a)}function renderLineTypePP1(a){paintBackdrop256(a),determineSpritesOnLine(currentScanline-frameStartingActiveScanline,261632);var b=currentScanline-frameStartingActiveScanline>3<<6<<1),g=e>>3<<1,h=0|d<<7;for(var m=7&e?33:32;m>0;--m)i=vram[f+g]|vram[f+g+1]<<8,g=g+2&127,j=h+(i>>5<<10|(31&i)<<2),k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b}}function renderLineTypePP1B(a){if(planeBEnabled){var b,c,d,e,f,g,h,i,j,k,l;e=511&scrollXBOffset,b=a-(7&e),c=currentScanline-frameStartingActiveScanline+scrollYBOffsetFrame&511,d=7&c,f=516096+(c>>3<<6<<1),g=e>>3<<1,h=262144|d<<7;for(var m=7&e?33:32;m>0;--m)i=vram[f+g]|vram[f+g+1]<<8,g=g+2&127,j=h+(i>>5<<10|(31&i)<<2),k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b,k=vram[j],++j,l=k>>4, l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b,k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b,k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b}}function renderLineTypePP2(a){var b,c,d,e,f,g,h,i,j,k,l;if(paintBackdrop512(a),determineSpritesOnLine(currentScanline-frameStartingActiveScanline,507392),renderSpritesLine(a,currentScanline-frameStartingActiveScanline,32,512,507392),planeAEnabled){e=1023&scrollXOffset,b=a-(7&e),c=currentScanline-frameStartingActiveScanline+scrollYOffsetFrame&scrollYMax,d=7&c,f=507904+(c>>3<<7<<1),g=e>>3<<1,h=0|d<<8;for(var m=7&e?65:64;m>0;--m)i=vram[f+g]|vram[f+g+1]<<8,g=g+2&255,j=h+(i>>6<<11|(63&i)<<2),k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b,k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetA|l]),++b,k=vram[j],++j,l=k>>4,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b,l=15&k,l>0&&(frameBackBuffer[b]=paletteValues[paletteOffsetB|l]),++b}renderSpritesLine(a,currentScanline-frameStartingActiveScanline,0,512,507392)}function determineSpritesOnLine(a,b){if(spritesOnLineCount=0,spritesEnabled&&!debugModeSpritesHidden)for(var c=0;c<125;++c,b+=4){var d=vram[b],e=a-d-1&255;if(!(e>=16)&&(spritesOnLine[spritesOnLineCount]=c,++spritesOnLineCount>=16&&spriteDebugModeLimit))break}}function renderSpritesLine(a,b,c,d,e){for(var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=spritesOnLineCount-1;o>=0;--o)f=spritesOnLine[o],g=e+(f<<2),(48&(j=vram[g+3]))===c&&(k=vram[g],l=b-k-1&255,((m=vram[g+2]|(3&j)<<8)=1008)&&(h=(192&j)>>2,i=debugModeSpriteInfoNumbers?f<<2:vram[g+1],n=256===d?spritePattAddress+((i>>4<<11)+((15&i)<<3))+(l<<7):spritePattAddress+((i>>5<<12)+((31&i)<<3))+(l<<8),m>=d&&(m-=1024),paintSprite(a+m,n,h)))}function paintSprite(a,b,c){for(var d=0,e=0,f=8;f>0;--f)d=vram[b],++b,e=d>>4,e>0&&(frameBackBuffer[a]=paletteValuesReal[c|e]),++a,e=15&d,e>0&&(frameBackBuffer[a]=paletteValuesReal[c|e]),++a}function renderLineTypeBYUV(a,b){colorsYUVValues||(colorsYUVValues=wmsx.ColorCache.getColorsYUVValues()),renderLineTypeBYxx(colorsYUVValues,a,b)}function renderLineTypeBYUVP(a,b){colorsYUVValues||(colorsYUVValues=wmsx.ColorCache.getColorsYUVValues()),renderLineTypeBYxxP(colorsYUVValues,a,b)}function renderLineTypeBYJK(a,b){colorsYJKValues||(colorsYJKValues=wmsx.ColorCache.getColorsYJKValues()),renderLineTypeBYxx(colorsYJKValues,a,b)}function renderLineTypeBYJKP(a,b){colorsYJKValues||(colorsYJKValues=wmsx.ColorCache.getColorsYJKValues()),renderLineTypeBYxxP(colorsYJKValues,a,b)}function renderLineTypeBYxx(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o;e=(currentScanline-frameStartingActiveScanline<0;p-=4)k=vram[i+j],l=vram[i+j+1],m=vram[i+j+2],n=vram[i+j+3],j=j+4&g,o=(7&n)<<9|(7&m)<<6|(7&l)<<3|7&k,frameBackBuffer[d]=a[(248&k)<<9|o],++d,frameBackBuffer[d]=a[(248&l)<<9|o],++d,frameBackBuffer[d]=a[(248&m)<<9|o],++d,frameBackBuffer[d]=a[(248&n)<<9|o],++d;renderCursorsLine(b,(currentScanline-frameStartingActiveScanline<512?-33&paletteOffsetB:paletteOffsetB,q=c>512?32|paletteOffsetB:paletteOffsetB,r=f;r>0;r-=4)k=vram[i+j],l=vram[i+j+1],m=vram[i+j+2],n=vram[i+j+3],j=j+4&g,o=(7&n)<<9|(7&m)<<6|(7&l)<<3|7&k,frameBackBuffer[d]=8&k?paletteValues[p|k>>4]:a[(248&k)<<9|o],++d,frameBackBuffer[d]=8&l?paletteValues[q|l>>4]:a[(248&l)<<9|o],++d,frameBackBuffer[d]=8&m?paletteValues[p|m>>4]:a[(248&m)<<9|o],++d,frameBackBuffer[d]=8&n?paletteValues[q|n>>4]:a[(248&n)<<9|o],++d;renderCursorsLine(b,(currentScanline-frameStartingActiveScanline<256?(-2&scrollXOffset)<<1&f:scrollXOffset<<1&f,e=b<<1,c=a;for(var j=e;j>0;j-=2)i=ys16BitColorMask&(vram[g+h]|vram[g+h+1]<<8),h=h+2&f,frameBackBuffer[c]=colors16bitValues[i],++c;renderCursorsLine(a,(currentScanline-frameStartingActiveScanline<0;--j)i=vram[g+h],h=h+1&f,frameBackBuffer[c]=colors8bitValues[i],++c;renderCursorsLine(a,(currentScanline-frameStartingActiveScanline<0;--j)i=vram[g+h],h=h+1&f,frameBackBuffer[c]=paletteValues[63&i],++c;renderCursorsLine(a,(currentScanline-frameStartingActiveScanline<>1),f=(imageWidth>>1)-1,i=scrollXOffset>>1&f,g=1&scrollXOffset,e=(b>>1)+g,c=a-g;for(var k=b>512?-33&paletteOffsetB:paletteOffsetB,l=b>512?32|paletteOffsetB:paletteOffsetB,m=e;m>0;--m)j=vram[h+i],i=i+1&f,frameBackBuffer[c]=paletteValues[k|j>>4],++c,frameBackBuffer[c]=paletteValues[l|15&j],++c;renderCursorsLine(a,(currentScanline-frameStartingActiveScanline<>2),f=(imageWidth>>2)-1,i=scrollXOffset>>2&f,g=3&scrollXOffset,e=(b>>2)+(g?1:0),c=a-g;for(var k=b>512?-33&paletteOffset:paletteOffset,l=b>512?32|paletteOffset:paletteOffset,m=e;m>0;--m)j=vram[h+i],i=i+1&f,frameBackBuffer[c]=paletteValues[k|j>>6],++c,frameBackBuffer[c]=paletteValues[l|j>>4&3],++c,frameBackBuffer[c]=paletteValues[k|j>>2&3],++c,frameBackBuffer[c]=paletteValues[l|3&j],++c;renderCursorsLine(a,(currentScanline-frameStartingActiveScanline<=0;--m,l-=8)h=vram[l]|(1&vram[l+2])<<8,(i=b-h-(1<=32||0==(16&(g=vram[l+6]))&&((j=vram[l+4]|(3&g)<<8)=992)&&(d=(192&g)>>6,e=0!=(32&g),f=debugModeSpriteInfoNumbers?m<<2:m,k=524032+(i<<2)+(f<<7),j>=c&&(j-=1024),paintCursor(a+j,k,d,e))}function paintCursor(a,b,c,d){var e=0,f=0;if(0!==c){f=paletteValuesReal[paletteOffsetCursor|c],d&&(f=4278190080&f|16777215&~f);for(var g=4;g>0;--g)e=vram[b],++b,128&e&&(frameBackBuffer[a]=f),++a,64&e&&(frameBackBuffer[a]=f),++a,32&e&&(frameBackBuffer[a]=f),++a,16&e&&(frameBackBuffer[a]=f),++a,8&e&&(frameBackBuffer[a]=f),++a, 4&e&&(frameBackBuffer[a]=f),++a,2&e&&(frameBackBuffer[a]=f),++a,1&e&&(frameBackBuffer[a]=f),++a}else if(d)for(g=4;g>0;--g)e=vram[b],++b,128&e&&(f=frameBackBuffer[a],frameBackBuffer[a]=4278190080&f|16777215&~f),++a,64&e&&(f=frameBackBuffer[a],frameBackBuffer[a]=4278190080&f|16777215&~f),++a,32&e&&(f=frameBackBuffer[a],frameBackBuffer[a]=4278190080&f|16777215&~f),++a,16&e&&(f=frameBackBuffer[a],frameBackBuffer[a]=4278190080&f|16777215&~f),++a,8&e&&(f=frameBackBuffer[a],frameBackBuffer[a]=4278190080&f|16777215&~f),++a,4&e&&(f=frameBackBuffer[a],frameBackBuffer[a]=4278190080&f|16777215&~f),++a,2&e&&(f=frameBackBuffer[a],frameBackBuffer[a]=4278190080&f|16777215&~f),++a,1&e&&(f=frameBackBuffer[a],frameBackBuffer[a]=4278190080&f|16777215&~f),++a}function cleanFrameBuffer(){wmsx.Util.arrayFill(frameBackBuffer,backdropValue)}function refresh(){videoSignal.newFrame(frameCanvas,0,0,refreshWidth,refreshHeight),refreshWidth=refreshHeight=0}function beginFrame(){if(framePulldown!==pulldown&&(frameVideoStandard=videoStandard,framePulldown=pulldown,updateSignalMetrics(!1)),renderMetricsUpdatePending&&updateRenderMetrics(!0),status^=2,modeData.allowIL&&2®ister[7]){bufferLineAdvance=PAINT_WIDTH<<1;var a=0!=(4®ister[7]);vramEOLineShift=a?1:0,2&status?(bufferPosition=PAINT_WIDTH<<1,vramEOLineAdd=a?1:0):(bufferPosition=PAINT_WIDTH,vramEOLineAdd=0)}else bufferLineAdvance=PAINT_WIDTH,bufferPosition=PAINT_WIDTH,vramEOLineShift=0,vramEOLineAdd=0;currentScanline=0,frameStartingActiveScanline=startingActiveScanline,frameDoubleScan=modeData.doublesScan,currentScanline>=frameStartingActiveScanline&&enterActiveDisplay()}function updateVRAMInterleaving(){vramInterleaving!==(modeData!==modes.P1)&&(vramInterleaving=modeData!==modes.P1,vramInterleaving?self.vramEnterInterleaving():self.vramExitInterleaving())}function initRAM(){vramInterleaving=!1;for(var a=0;aVRAM_LIMIT&&(vramPointerRead&=VRAM_LIMIT),a},this.output60=function(a){softResetON||(vram[vramPointerWrite]=a,vramPointerWriteInc&&++vramPointerWrite>VRAM_LIMIT&&(vramPointerWrite&=VRAM_LIMIT))},this.input61=function(){if(softResetON)return paletteRAM[0];if(3==(3&palettePointer))return palettePointerReadInc&&(palettePointer&=252),0;var a=paletteRAM[palettePointer];return palettePointerReadInc&&(2==(3&palettePointer)?palettePointer=palettePointer+2&255:++palettePointer),a},this.output61=function(a){return softResetON?paletteRAMWrite(0,0):3==(3&palettePointer)?palettePointer&=-4:(a&=0==(3&palettePointer)?159:31,paletteRAMWrite(palettePointer,a),void(2==(3&palettePointer)?palettePointer=palettePointer+2&255:++palettePointer))},this.input62=function(){return commandProcessor.cpuRead()},this.output62=function(a){commandProcessor.cpuWrite(a)},this.input63=function(){var a=register[registerSelect]|REG_READ_OR[registerSelect];return registerSelectReadInc&&++registerSelect>63&&(registerSelect&=63),a},this.output63=function(a){softResetON||registerWrite(registerSelect,a),registerSelectWriteInc&&++registerSelect>63&&(registerSelect&=63)},this.output64=function(a){softResetON&&(a=0),registerSelect=63&a,registerSelectWriteInc=0==(128&a),registerSelectReadInc=0==(64&a)},this.input65=function(){return commandProcessor.updateStatus(),status},this.input66=function(){return interruptFlags},this.output66=function(a){0!=(7&a)&&(interruptFlags&=~a,updateIRQ())},this.output67=function(a){var b=systemControl^a;systemControl=a,2&b&&(softResetON=0!=(2&systemControl))&&softReset(),1&b&&(status=-5&status|(1&systemControl)<<2,updateMode())},this.output68=function(a){kanjiPort1Address=129024&kanjiPort1Address|(63&a)<<5},this.output69=function(a){kanjiPort1Address=(63&a)<<11|2016&kanjiPort1Address},this.input69=function(){var a=self.readKanji(kanjiPort1Address);return kanjiPort1Address=131040&kanjiPort1Address|kanjiPort1Address+1&31,a},this.output6a=function(a){kanjiPort2Address=260096&kanjiPort2Address|(63&a)<<5},this.output6b=function(a){kanjiPort2Address=131072|(63&a)<<11|2016&kanjiPort2Address},this.input6b=function(){var a=self.readKanji(kanjiPort2Address);return kanjiPort2Address=262112&kanjiPort2Address|kanjiPort2Address+1&31,a},this.readKanji=function(a){var b=wmsx.CartridgeKanjiFont.connectedInstance;return b?b.readKanji(a):255},this.setTurboMulti=function(a){commandProcessor.setTurboMulti(a)},this.getVDPTurboMulti=function(){return commandProcessor.getVDPTurboMulti()},this.setDefaults=function(){self.setDebugMode(STARTING_DEBUG_MODE),self.setSpriteDebugMode(STARTING_SPRITES_DEBUG_MODE)},this.videoSignalDisplayStateUpdate=function(a,b){videoDisplayed=a,superimposeActive!==b&&(superimposeActive=b,superimposeActive&&initFrameResources(!0),updateYSEnabled())},this.refreshDisplayMetrics=function(){videoSignal.setDisplayMetrics(renderWidth,renderHeight)},this.resetOutputAutoMode=function(){cartridge&&cartridge.resetOutputAutoMode()},this.reset=function(){systemControl=0,status=0,softResetON=!1,registerSelect=0,registerSelectReadInc=!0,registerSelectWriteInc=!0,kanjiPort1Address=0,kanjiPort2Address=131072,softReset(),updateSignalMetrics(!0),frame=cycles=lastBUSCyclesComputed=0,frameVideoStandard=videoStandard,framePulldown=pulldown,currentScanline=-1,beginFrame()},this.getVDPCycles=function(){return vdp.getVDPCycles()},this.getScreenText=function(){},this.setStatusTR=function(a){a?status|=128:status&=-129},this.setStatusBD=function(a){a?status|=16:status&=-17},this.setStatusCE=function(a){a?status|=1:status&=-2},this.setDebugMode=function(a){debugMode=(a+8)%8;var b=debugModeSpriteHighlight;debugModeSpriteHighlight=debugMode>=1&&debugMode<=3,debugModeSpriteInfo=2===debugMode||3===debugMode,debugModeSpriteInfoNumbers=2===debugMode,debugModeSpritesHidden=debugMode>=4;var c=debugModePatternInfo;debugModePatternInfo=debugMode>=5,debugModePatternInfoBlocks=6===debugMode,debugModePatternInfoNames=7===debugMode,b===debugModeSpriteHighlight&&c===debugModePatternInfo||updateAllPaletteValues(),debugModeSpriteHighlight&&initFrameResources(!0),updateLineActiveType(),updateSpritePattAddress()},this.setSpriteDebugMode=function(a){spriteDebugMode=a>=0?a%4:4+a,spriteDebugModeLimit=0===spriteDebugMode||2===spriteDebugMode},this.setColorAndPaletteMode=function(a,b){initColorCaches(),updateAllPaletteValues()},this.cycleEventRefresh=function(){refreshWidth&&refresh()},this.lineEventStartActiveDisplay=function(){status&=-33,currentScanline===frameStartingActiveScanline&&enterActiveDisplay(),currentScanline-frameStartingActiveScanline===horizontalIntLine&&triggerHorizontalInterrupt()},this.lineEventRenderLine=function(){videoDisplayed&¤tScanline>=startingVisibleTopBorderScanline&¤tScanline>1,c=vram.slice(0,b),d=0;d>1,b=0,c=a,d=vram.slice(a),e=0;e>8&15,register[32]=255&a}function getSY(){return((15®ister[35])<<8|register[34])&imageHeightMask}function setSY(a){a=getSY()&~imageHeightMask|a&imageHeightMask,register[35]=a>>8&15,register[34]=255&a}function getSourcePlaneBOffset(){return isP1&&2®ister[33]?2048:0}function getSA(){return(7®ister[35])<<16|register[34]<<8|register[32]}function setSA(a){register[35]=a>>16&7,register[34]=a>>8&255,register[32]=255&a}function getKA(){return(3®ister[35])<<16|register[34]<<8|register[32]}function getDX(){return((7®ister[37])<<8|register[36])&imageWidthMask}function setDX(a){a=getDX()&~imageWidthMask|a&imageWidthMask,register[37]=a>>8&7,register[36]=255&a}function getDY(){return((15®ister[39])<<8|register[38])&imageHeightMask}function setDY(a){a=getDY()&~imageHeightMask|a&imageHeightMask,register[39]=a>>8&15,register[38]=255&a}function getDestPlaneBOffset(){return isP1&&2®ister[37]?2048:0}function getDA(){return(7®ister[39])<<16|register[38]<<8|register[36]}function setDA(a){register[39]=a>>16&7,register[38]=a>>8&255,register[36]=255&a}function getNX(){return(7®ister[41])<<8|register[40]||2048}function getNY(){return(15®ister[43])<<8|register[42]||4096}function getNA(){return(7®ister[43])<<16|register[42]<<8|register[40]||524288}function getMJ(){return(15®ister[41])<<8|register[40]}function getMI(){return(15®ister[43])<<8|register[42]}function getDIX(){return 4®ister[44]?-1:1}function getDIY(){return 8®ister[44]?-1:1}function getMAJ(){return 1®ister[44]}function getNEQ(){return 0!=(2®ister[44])}function getLOP(){return LOGICAL_OPERATIONS[31®ister[45]]}function getWMDirect(){return register[46]<<8|register[47]}function getWM(a){return isP1?a?register[47]<<8|register[47]:register[46]<<8|register[46]:getWMDirect()}function wm8ForAddr(a,b){return a>>((1&~b)<<3)&255}function wm16ForAddr(a,b){return a>>((1&b)<<3)&255|a<<((1&b)<<3)&65280}function getFC(a){return isP1?a?register[49]<<8|register[49]:register[48]<<8|register[48]:register[48]<<8|register[49]}function getBC(a){return isP1?a?register[51]<<8|register[51]:register[50]<<8|register[50]:register[50]<<8|register[51]}function getAYME(){return register[52]>>2&3}function getAXME(){return 3®ister[52]}function setBX(a){register[54]=a>>8,register[53]=255&a}function LMMC(){DX=getDX(),DESTOff=getDestPlaneBOffset(),DY=getDY(),NX=getNX(),NY=getNY(),DIX=getDIX(),DIY=getDIY(),LOP=getLOP(),WM=getWM(DESTOff),EDX=DX,CX=0,CY=0,SX=0,writeStart(LMMCNextWrite)}function LMMCNextWrite(a){4===typeBPP?(a|=a<<8,LMMCNextPixel(a),CE&&LMMCNextPixel(a)):8===typeBPP?LMMCNextPixel(a<<8|a):16===typeBPP?null===writeDataPending?writeDataPending=a:(LMMCNextPixel(writeDataPending<<8|a),writeDataPending=null):(a|=a<<8,LMMCNextPixel(a),CE&&LMMCNextPixel(a),CE&&LMMCNextPixel(a),CE&&LMMCNextPixel(a)),CE||(setDY(DY),v9990.setStatusTR(0))}function LMMCNextPixel(a){logicalPSETX(EDX,DY|DESTOff,SX,a,LOP,WM),++CX,++SX,CX>=NX?(EDX=DX,CX=0,++CY,DY=DY+DIY&imageHeightMask,CY>=NY&&finish()):EDX=EDX+DIX&imageWidthMask}function LMMV(){for(var a=getDX(),b=getDestPlaneBOffset(),c=getDY(),d=getNX(),e=getNY(),f=getDIX(),g=getDIY(),h=getLOP(),i=getWM(b),j=getFC(b),k=e;k>0;--k){for(var l=a,m=0;m>8):(readData=255&readDataPending,readDataPending=null):(readData=63&readData|LMCMNextPixel(4),CE&&(readData=207&readData|LMCMNextPixel(5)),CE&&(readData=243&readData|LMCMNextPixel(6)),CE&&(readData=252&readData|LMCMNextPixel(7))),CE||(setSY(SY),v9990.setStatusTR(0))}function LMCMNextPixel(a){var b=normalPGETX(ESX,SY|SRCOff,a);return++CX,CX>=NX?(ESX=SX,CX=0,++CY,SY=SY+DIY&imageHeightMask,CY>=NY&&finish()):ESX=ESX+DIX&imageWidthMask,b}function LMMM(){for(var a=getSX(),b=getSourcePlaneBOffset(),c=getSY(),d=getDX(),e=getDestPlaneBOffset(),f=getDY(),g=getNX(),h=getNY(),i=getDIX(),j=getDIY(),k=getLOP(),l=getWM(e),m=h;m>0;--m){for(var n=a,o=d,p=g;p>0;--p)logicalPCOPYXX(o,f|e,n,c|b,k,l),n=n+i&imageWidthMask,o=o+i&imageWidthMask;c=c+j&imageHeightMask,f=f+j&imageHeightMask}setSY(c),setDY(f),start(LMMMTiming,g*h,h)}function CMMC(){DX=getDX(),DESTOff=getDestPlaneBOffset(),DY=getDY(),NX=getNX(),NY=getNY(),DIX=getDIX(),DIY=getDIY(),LOP=getLOP(),WM=getWM(DESTOff),FBC=getFC(DESTOff)<<16|getBC(DESTOff),EDX=DX,CX=0,CY=0,writeStart(CMMCNextWrite)}function CMMCNextWrite(a){for(var b=7;b>=0;--b){if(logicalPSETX(EDX,DY|DESTOff,EDX,FBC>>((a>>b&1)<<4)&65535,LOP,WM),++CX>=NX){if(EDX=DX,CX=0,++CY,DY=DY+DIY&imageHeightMask,CY>=NY){finish();break}}else EDX=EDX+DIX&imageWidthMask}CE||(setDY(DY),v9990.setStatusTR(0))}function CMMM(){for(var a=getSA(),b=getDX(),c=getDestPlaneBOffset(),d=getDY(),e=getNX(),f=getNY(),g=getDIX(),h=getDIY(),i=getLOP(),j=getWM(c),k=getFC(c)<<16|getBC(c),l=0,m=0,n=0,o=f;o>0;--o){for(var p=b,q=0;q>>1|(1&a)<<18],a=a+1&VRAM_LIMIT):(l=vram[a],a=a+1&VRAM_LIMIT)),n=l>>7-(7&m)&1,logicalPSETX(p,d|c,p,k>>(n<<4)&65535,i,j),p=p+g&imageWidthMask,++m;d=d+h&imageHeightMask}setSA(a),setDY(d),start(BMXLTiming,e*f,f)}function CMMK(){for(var a=getKA(),b=getDX(),c=getDestPlaneBOffset(),d=getDY(),e=getNX(),f=getNY(),g=getDIX(),h=getDIY(),i=getLOP(),j=getWM(c),k=getFC(c)<<16|getBC(c),l=0,m=0,n=0,o=f;o>0;--o){for(var p=b,q=0;q>3|(7&a)<<1);a=262112&a|16&r|(1&r)<<3|(14&r)>>1}n=l>>7-(7&m)&1,logicalPSETX(p,d|c,p,k>>(n<<4)&65535,i,j),p=p+g&imageWidthMask,++m}d=d+h&imageHeightMask}setDY(d),start(BMXLTiming,e*f,f)}function BMXL(){for(var a=getSA(),b=getDX(),c=getDestPlaneBOffset(),d=getDY(),e=getNX(),f=getNY(),g=getDIX(),h=getDIY(),i=getLOP(),j=getWM(c),k=0,l=0,m=0,n=f;n>0;--n){for(var o=b,p=0;p>>1|(1&a)<<18;k=vram[q]<<8,a=a+1&VRAM_LIMIT,q=a>>>1|(1&a)<<18,k|=vram[q],a=a+1&VRAM_LIMIT}else q=a>>>1|(1&a)<<18,k=vram[q],k|=k<<8,a=a+1&VRAM_LIMIT;else 16===typeBPP?(k=vram[a]<<8|vram[a+1],a=a+2&VRAM_LIMIT):(k=vram[a],k|=k<<8,a=a+1&VRAM_LIMIT);logicalPSETX(o,d|c,l,k,i,j),o=o+g&imageWidthMask,++l,m+=typeBPP}d=d+h&imageHeightMask}setSA(a),setDY(d),start(BMXLTiming,e*f,f)}function BMLX(){var a=getSX(),b=getSourcePlaneBOffset(),c=getSY(),d=getDA(),e=getNX(),f=getNY(),g=getDIX(),h=getDIY(),i=getLOP(),j=getWMDirect(),k=0,l=0;if(isP1)for(var m=f;m>0;--m){for(var n=a,o=e;o>0;--o)logicalPCOPYLXP1(d+(l>>3)&VRAM_LIMIT,k,n,c|b,i,j),n=n+g&imageWidthMask,++k,l+=typeBPP;c=c+h&imageHeightMask}else for(m=f;m>0;--m){for(n=a,o=e;o>0;--o)logicalPCOPYLX(d+(l>>3)&VRAM_LIMIT,k,n,c|b,i,j),n=n+g&imageWidthMask,++k,l+=typeBPP;c=c+h&imageHeightMask}setSY(c),setDA(d),start(BMLXTiming,e*f,f)}function BMLL(){var a=getSA(),b=getDA(),c=getNA(),d=getDIX(),e=getLOP(),f=getWMDirect();if(isP1)for(var g=c;g>0;--g)logicalPCOPYLLP1(b,a,e,f),a=a+d&VRAM_LIMIT,b=b+d&VRAM_LIMIT;else for(g=c;g>0;--g)logicalPCOPYLL(b,a,e,f),a=a+d&VRAM_LIMIT,b=b+d&VRAM_LIMIT;setSA(a),setDA(b),start(BMLLTiming,c,0)}function LINE(){var a=getDX(),b=getDestPlaneBOffset(),c=getDY(),d=getMJ(),e=getMI(),f=getDIX(),g=getDIY(),h=getMAJ(),i=getLOP(),j=getWM(b),k=getFC(b),l=0,m=0;if(0===h)for(var n=d;n>=0;--n)logicalPSETX(a,c|b,a,k,i,j),a=a+f&imageWidthMask,e>0&&(m+=e)<<1>=d&&(c=c+g&imageHeightMask,m-=d,++l);else for(n=d;n>=0;--n)logicalPSETX(a,c|b,a,k,i,j),c=c+g&imageHeightMask,e>0&&(m+=e)<<1>=d&&(a=a+f&imageWidthMask,m-=d,++l);setDX(a),setDY(c), start(LMMVTiming,d,e)}function SRCH(){var a=getSX(),b=getSourcePlaneBOffset(),c=getSY()|b,d=getDIX(),e=getNEQ(),f=getFC(b),g=1===d?imageWidth:-1,h=a,i=0,j=!1,k=16===typeBPP?65535:4===typeBPP?61440:2===typeBPP?49152:65280,l=(typeData.ppB<<1)-1;if(l<0&&(l=0),e)do{if(i=f&k>>(h&l)*typeBPP,normalPGETX(h,c,h)!==i){j=!0;break}h+=d}while(h!==g);else do{if(i=f&k>>(h&l)*typeBPP,normalPGETX(h,c,h)===i){j=!0;break}h+=d}while(h!==g);var m=((7®ister[33])<<8|register[32])&~imageWidthMask,n=j?m|h:1===d?m+h&2047:2047;setSX(n),setBX(n),v9990.setStatusBD(j),start(LMMVTiming,Math.abs(h-a)+1,1)}function POINT(){SX=getSX(),SY=getSY()|getSourcePlaneBOffset(),readStart(POINTNextRead)}function POINTNextRead(){if(4===typeBPP)readData=15&readData|normalPGETX(SX,SY,2);else if(8===typeBPP)readData=normalPGETX(SX,SY,1);else if(16===typeBPP){if(null===readDataPending)return readDataPending=normalPGETX(SX,SY,0),void(readData=readDataPending>>8);readData=255&readDataPending,readDataPending=null}else readData=63&readData|normalPGETX(SX,SY,4);v9990.setStatusTR(0),finish()}function PSET(){var a=getDX(),b=getDestPlaneBOffset(),c=getDY(),d=getLOP(),e=getWM(b),f=getFC(b),g=getAXME(),h=getAYME();logicalPSETX(a,c|b,a,f,d,e);var i=1===g?1:3===g?-1:0,j=1===h?1:3===h?-1:0;setDX(a+i),setDY(c+j),start(LMMVTiming,1,1)}function ADVN(){var a=getDX(),b=getDY(),c=getAXME(),d=getAYME(),e=1===c?1:3===c?-1:0,f=1===d?1:3===d?-1:0;setDX(a+e),setDY(b+f),start(LMMVTiming,1,1)}function STOP(){finish(!0)}function normalPGETX(a,b,c){var d,e,f;if(4===typeBPP)d=1-(1&a)<<2,e=3-(3&c)<<2,a>>>=1,f=15;else if(8===typeBPP)d=0,e=1-(1&c)<<3,f=255;else{if(16===typeBPP){a<<=1;var g=b*imageWidthBytes+a&VRAM_LIMIT;return vram[g]<<8|vram[g+1]}d=3-(3&a)<<1,e=7-(7&c)<<1,a>>>=2,f=3}return g=b*imageWidthBytes+a&VRAM_LIMIT,(vram[g]>>d&f)<>>=1,i=15;else if(8===typeBPP)g=1-(1&c)<<3,h=0,i=255;else{if(16===typeBPP){a<<=1;var j=b*imageWidthBytes+a&VRAM_LIMIT,k=vram[j]<<8|vram[j+1],l=e(k,d,f);return vram[j]=l>>8,void(vram[j+1]=255&l)}g=7-(7&c)<<1,h=3-(3&a)<<1,a>>>=2,i=3}j=b*imageWidthBytes+a&VRAM_LIMIT,d=(d>>g&i)<>>=1,a>>>=1,i=15;else if(8===typeBPP)g=h=0,i=255;else{if(16===typeBPP){c<<=1,a<<=1;var j=d*imageWidthBytes+c&VRAM_LIMIT,k=b*imageWidthBytes+a&VRAM_LIMIT,l=vram[j]<<8|vram[j+1],m=vram[k]<<8|vram[k+1],n=e(m,l,f);return vram[k]=n>>8,void(vram[k+1]=255&n)}g=3-(3&c)<<1,h=3-(3&a)<<1,c>>>=2,a>>>=2,i=3}j=d*imageWidthBytes+c&VRAM_LIMIT,k=b*imageWidthBytes+a&VRAM_LIMIT,l=(vram[j]>>g&i)<>>=1,i=15;else if(8===typeBPP)g=h=0,i=255;else{if(16===typeBPP){c<<=1;var j=d*imageWidthBytes+c&VRAM_LIMIT,k=vram[j]<<8|vram[j+1],l=vram[a]<<8|vram[a+1],m=e(l,k,wm16ForAddr(f,a));return vram[a]=m>>8,void(vram[a+1]=255&m)}g=3-(3&c)<<1,h=3-(3&b)<<1,c>>>=2,i=3}j=d*imageWidthBytes+c&VRAM_LIMIT,k=(vram[j]>>g&i)<>>=1,i=15;else if(8===typeBPP)g=h=0,i=255;else{if(16===typeBPP){c<<=1;var j=d*imageWidthBytes+c&VRAM_LIMIT,k=vram[j]<<8|vram[j+1],l=a>>>1|(1&a)<<18;a=a+1&VRAM_LIMIT;var m=a>>>1|(1&a)<<18,n=vram[l]<<8|vram[m],o=e(n,k,wm16ForAddr(f,a));return vram[l]=o>>8,void(vram[m]=255&o)}g=3-(3&c)<<1,h=3-(3&b)<<1,c>>>=2,i=3}f=wm8ForAddr(f,a),j=d*imageWidthBytes+c&VRAM_LIMIT,k=(vram[j]>>g&i)<>>1|(1&a)<<18,vram[a]=e(vram[a],k,i<>>1|(1&a)<<18,b=b>>>1|(1&b)<<18,vram[a]=c(vram[a],vram[b],d)}function lopNULL(a,b,c){return a&~c}function lopNOR(a,b,c){return a&~c|~(a|b)&c}function lopEXD(a,b,c){return a&~(b&c)}function lopNOTS(a,b,c){return a&~c|~b&c}function lopEXS(a,b,c){return a&~c|b&~a&c}function lopNOTD(a,b,c){return a&~c|~a&c}function lopXOR(a,b,c){return a^b&c}function lopNAND(a,b,c){return a&~c|~(a&b)&c}function lopAND(a,b,c){return a&(b|~c)}function lopEQV(a,b,c){return a&~c|~(a^b)&c}function lopD(a,b,c){return a}function lopNEXS(a,b,c){return a&~c|(~b|a)&c}function lopS(a,b,c){return a&~c|b&c}function lopNEXD(a,b,c){return a|(~a|b)&c}function lopOR(a,b,c){return a|b&c}function lopID(a,b,c){return a|c}function lopTNULL(a,b,c){return 0===b?a:a&~c}function lopTNOR(a,b,c){return 0===b?a:a&~c|~(a|b)&c}function lopTEXD(a,b,c){return 0===b?a:a&~(b&c)}function lopTNOTS(a,b,c){return 0===b?a:a&~c|~b&c}function lopTEXS(a,b,c){return 0===b?a:a&~c|b&~a&c}function lopTNOTD(a,b,c){return 0===b?a:a&~c|~a&c}function lopTXOR(a,b,c){return 0===b?a:a^b&c}function lopTNAND(a,b,c){return 0===b?a:a&~c|~(a&b)&c}function lopTAND(a,b,c){return 0===b?a:a&(b|~c)}function lopTEQV(a,b,c){return 0===b?a:a&~c|~(a^b)&c}function lopTD(a,b,c){return a}function lopTNEXS(a,b,c){return 0===b?a:a&~c|(~b|a)&c}function lopTS(a,b,c){return 0===b?a:a&~c|b&c}function lopTNEXD(a,b,c){return 0===b?a:a|(~a|b)&c}function lopTOR(a,b,c){return 0===b?a:a|b&c}function lopTID(a,b,c){return 0===b?a:a|c}function start(a,b,c,d){CE=1,v9990.setStatusCE(CE),writeHandler=null,readHandler=null,estimateDuration(a,b,c,d)}function estimateDuration(a,b,c,d){if(d)finishingCycle=-1;else if(a&&0!==turboClockMulti){var e=a[modeData.cmdTiming][dispAndSpritesMode],f=e[typeBPP]||e,g=BASE_CLOCK/50/256/f,h=b*g*self.COMMAND_PER_PIXEL_DURATION_FACTOR/turboClockMulti|0;finishingCycle=v9990.getVDPCycles()+h}else finishingCycle=0,finish()}function writeStart(a){start(null,0,0,!0),writeHandler=a,writeDataPending=null,v9990.setStatusTR(1)}function readStart(a){start(null,0,0,!0),readHandler=a,readDataPending=null,v9990.setStatusTR(1),readHandler()}function finish(a){CE=0,v9990.setStatusCE(CE),a||v9990.triggerCommandCompletionInterrupt(),writeHandler=null,writeDataPending=null,readDataPending=null,readHandler=null}var self=this;this.connectV9990=function(a,b,c){v9990=a,vram=b,register=c},this.reset=function(){STOP()},this.startCommand=function(a){switch(240&a){case 0:STOP();break;case 16:LMMC();break;case 32:LMMV();break;case 48:LMCM();break;case 64:LMMM();break;case 80:CMMC();break;case 96:CMMK();break;case 112:CMMM();break;case 128:BMXL();break;case 144:BMLX();break;case 160:BMLL();break;case 176:LINE();break;case 192:SRCH();break;case 208:POINT();break;case 224:PSET();break;case 240:ADVN()}},this.cpuWrite=function(a){writeHandler?writeHandler(a):v9990.setStatusTR(0)},this.cpuRead=function(){var a=readData;return readHandler?readHandler():v9990.setStatusTR(0),a},this.updateStatus=function(){CE&&finishingCycle>=0&&(0===finishingCycle||v9990.getVDPCycles()>=finishingCycle)&&finish()},this.setV9990ModeData=function(a,b,c,d){modeData=a,typeData=b,imageWidth=c,imageWidthMask=c-1,imageHeight=d,imageHeightMask=d-1,imageWidthBytes=imageWidth*typeData.bpp>>3,typeBPP=typeData.bpp,isP1="P1"===a.name,colosPPBShift=typeData.ppB>>1,colorPPBMask=-1<8?0:a},this.getV9990TurboMulti=function(){return turboClockMulti};var BASE_CLOCK=wmsx.V9990.BASE_CLOCK,VRAM_LIMIT=wmsx.V9990.VRAM_LIMIT,COMMAND_HANDLERS={LMMCNextWrite:LMMCNextWrite,LMCMNextRead:LMCMNextRead,POINTNextRead:POINTNextRead};self.COMMAND_PER_PIXEL_DURATION_FACTOR=.99 ;var v9990,vram,register,CE=0,SX=0,SY=0,SRCOff=0,DX=0,DY=0,DESTOff=0,NX=0,NY=0,ESX=0,EDX=0,DIX=0,DIY=0,CX=0,CY=0,WM=0,FBC=0,LOP,readData=0,writeDataPending=null,readDataPending=null,writeHandler=null,readHandler=null,finishingCycle=0,dispAndSpritesMode=0,turboClockMulti=1,modeData,typeData,isP1=!1,typeBPP=8,colosPPBShift=0,colorPPBMask=0,imageWidth=0,imageHeight=0,imageWidthMask=0,imageHeightMask=0,imageWidthBytes=0,LOGICAL_OPERATIONS=[lopNULL,lopNOR,lopEXD,lopNOTS,lopEXS,lopNOTD,lopXOR,lopNAND,lopAND,lopEQV,lopD,lopNEXS,lopS,lopNEXD,lopOR,lopID,lopTNULL,lopTNOR,lopTEXD,lopTNOTS,lopTEXS,lopTNOTD,lopTXOR,lopTNAND,lopTAND,lopTEQV,lopTD,lopTNEXS,lopTS,lopTNEXD,lopTOR,lopTID],LMMVTiming=[[{2:723,4:537,8:400,16:200},{2:720,4:526,8:394,16:199},{2:683,4:502,8:372,16:188}],[{2:481,4:352,8:262,16:131},{2:478,4:349,8:258,16:129},{2:441,4:315,8:232,16:116}],[393,218,167],[528,320,251]],LMMMTiming=[[{2:625,4:386,8:193,16:96},{2:625,4:376,8:188,16:95},{2:578,4:353,8:176,16:89}],[{2:409,4:248,8:123,16:62},{2:402,4:243,8:120,16:60},{2:361,4:215,8:108,16:54}],[186,104,80],[371,209,160]],BMLLTiming=[[193,188,177],[123,120,107],[186,103,79],[186,103,79]],BMXLTiming=[[{2:626,4:387,8:194,16:97},{2:626,4:377,8:189,16:95},{2:583,4:356,8:177,16:90}],[{2:417,4:250,8:125,16:62},{2:411,4:243,8:121,16:60},{2:364,4:216,8:108,16:54}],[228,129,100],[372,210,160]],BMLXTiming=[[{2:625,4:386,8:193,16:96},{2:625,4:376,8:188,16:95},{2:578,4:353,8:176,16:89}],[{2:409,4:248,8:123,16:62},{2:402,4:243,8:120,16:60},{2:361,4:215,8:108,16:54}],[195,115,90],[371,209,160]];this.saveState=function(){return{ce:CE,rd:readData,rdp:readDataPending,wdp:writeDataPending,wh:writeHandler&&writeHandler.name,rh:readHandler&&readHandler.name,fc:finishingCycle,SX:SX,SY:SY,SYP1O:SRCOff,DX:DX,DY:DY,DYP1O:DESTOff,NX:NX,NY:NY,ESX:ESX,EDX:EDX,DIX:DIX,DIY:DIY,CX:CX,CY:CY,WM:WM,FBC:FBC,LOP:LOP&&LOGICAL_OPERATIONS.indexOf(LOP),dsm:dispAndSpritesMode,tcm:turboClockMulti}},this.loadState=function(a){CE=a.ce,readData=a.rd,readDataPending=a.rdp,writeDataPending=a.wdp,writeHandler=COMMAND_HANDLERS[a.wh],readHandler=COMMAND_HANDLERS[a.rh],finishingCycle=a.fc,SX=a.SX,SY=a.SY,SRCOff=a.SYP1O,DX=a.DX,DY=a.DY,DESTOff=a.DYP1O,NX=a.NX,NY=a.NY,ESX=a.ESX,EDX=a.EDX,DIX=a.DIX,DIY=a.DIY,CX=a.CX,CY=a.CY,WM=a.WM,FBC=a.FBC,LOP=a.LOP>=0?LOGICAL_OPERATIONS[a.LOP]:void 0,dispAndSpritesMode=a.dsm,turboClockMulti=void 0!==a.tcm?a.tcm:1},this.eval=function(str){return eval(str)}},wmsx.VideoSignal=function(a,b){"use strict";this.connectMonitor=function(a){c=a},this.newFrame=function(a,b,d,e,f){c.newFrame(this,a,b,d,e,f)},this.signalOff=function(){c&&c.signalOff(this)},this.showOSD=function(a,b,d){c&&c.showOSD(a,b,d)},this.setDisplayMetrics=function(a,b){c&&c.setDisplayMetrics(this,a,b)},this.setColorAndPaletteMode=function(b,c){a.setColorAndPaletteMode(b,c)},this.resetOutputAutoMode=function(){a.resetOutputAutoMode()},this.refreshDisplayMetrics=function(){a.refreshDisplayMetrics()},this.videoSignalDisplayStateUpdate=function(b,c){a.videoSignalDisplayStateUpdate(b,c)},this.setOutputAutoMode=function(a){c&&c.setOutputAutoMode(this,a)},this.getSignalName=function(){return b},this.setDebugMode=function(a){c&&c.setDebugMode(this,a)},this.getScreenText=function(){return a.getScreenText()},this.name=b;var c},wmsx.VideoStandard={NTSC:{name:"NTSC",desc:"NTSC 60Hz",totalWidth:342,totalHeight:262,topBorderHeight:16,targetFPS:60,pulldowns:{60:{standard:"NTSC",frequency:60,divider:1,linesPerCycle:262,firstStepCycleLinesAdjust:0,cadence:[1],steps:1},120:{standard:"NTSC",frequency:120,divider:2,linesPerCycle:262,firstStepCycleLinesAdjust:0,cadence:[1],steps:1},"120s":{standard:"NTSC",frequency:120,divider:1,linesPerCycle:131,firstStepCycleLinesAdjust:0,cadence:[0,1],steps:2},50:{standard:"NTSC",frequency:50,divider:1,linesPerCycle:314,firstStepCycleLinesAdjust:2,cadence:[1,1,1,1,2],steps:5},100:{standard:"NTSC",frequency:100,divider:2,linesPerCycle:314,firstStepCycleLinesAdjust:2,cadence:[1,1,1,1,2],steps:5},"100s":{standard:"NTSC",frequency:100,divider:1,linesPerCycle:157,firstStepCycleLinesAdjust:2,cadence:[0,1,0,1,1,0,1,0,1,1],steps:10},TIMER:{standard:"NTSC",frequency:62.5,divider:1,linesPerCycle:262,firstStepCycleLinesAdjust:0,cadence:[1],steps:1}}},PAL:{name:"PAL",desc:"PAL 50Hz",totalWidth:342,totalHeight:313,topBorderHeight:43,targetFPS:50,pulldowns:{50:{standard:"PAL",frequency:50,divider:1,linesPerCycle:313,firstStepCycleLinesAdjust:0,cadence:[1],steps:1},100:{standard:"PAL",frequency:100,divider:2,linesPerCycle:313,firstStepCycleLinesAdjust:0,cadence:[1],steps:1},"100s":{standard:"PAL",frequency:100,divider:1,linesPerCycle:156,firstStepCycleLinesAdjust:1,cadence:[0,1],steps:2},60:{standard:"PAL",frequency:60,divider:1,linesPerCycle:261,firstStepCycleLinesAdjust:-1,cadence:[0,1,1,1,1,1],steps:6},120:{standard:"PAL",frequency:120,divider:2,linesPerCycle:261,firstStepCycleLinesAdjust:-1,cadence:[0,1,1,1,1,1],steps:6},"120s":{standard:"PAL",frequency:120,divider:1,linesPerCycle:130,firstStepCycleLinesAdjust:5,cadence:[0,0,1,0,1,0,0,1,0,1,0,1],steps:12},TIMER:{standard:"PAL",frequency:50,divider:1,linesPerCycle:313,firstStepCycleLinesAdjust:0,cadence:[1],steps:1}}}},wmsx.AudioTables={setupVolPan:function(a,b,c,d,e){this.createVolPanVolumeTable();for(var f=0;ff?b[f]:"f")),h=Number("0x"+(1===c.length?c[0]:c.length>f?c[f]:"8"));d[f]=this.VOLPAN_VOLUME_TABLE[this.VOL_VALUES[g]+this.PAN_VALUES[0][h]],e[f]=this.VOLPAN_VOLUME_TABLE[this.VOL_VALUES[g]+this.PAN_VALUES[1][h]]}},createVolPanVolumeTable:function(){if(!this.VOLPAN_VOLUME_TABLE){for(var a=new Array(256),b=0;b<127;++b)a[b]=Math.pow(10,-.75*b/20);for(b=127;b<256;++b)a[b]=0;this.VOLPAN_VOLUME_TABLE=a}},VOL_VALUES:[128,28,26,24,22,20,18,16,14,12,10,8,6,4,2,0],PAN_VALUES:[[127,0,0,0,0,0,0,0,0,4,8,12,16,20,24,127],[127,127,24,20,16,12,8,4,0,0,0,0,0,0,0,0]],VOLPAN_VOLUME_TABLE:void 0},wmsx.PSG=function(controllersSocket,ledsSocket,secondary){"use strict";function updateKanaLed(){ledsSocket&&ledsSocket.ledStateChanged(1,(128&~register[15])>>7)}this.connectBus=function(a){var b=secondary?16:160;a.connectInputDevice(b,wmsx.DeviceMissing.inputPortIgnored),a.connectOutputDevice(b,this.outputA0),a.connectInputDevice(b+1,wmsx.DeviceMissing.inputPortIgnored),a.connectOutputDevice(b+1,this.outputA1),a.connectInputDevice(b+2,this.inputA2),a.connectOutputDevice(b+2,wmsx.DeviceMissing.outputPortIgnored),powerIsOn&&audioChannel.connectAudio()},this.disconnectBus=function(a){var b=secondary?16:160;a.disconnectInputDevice(b,wmsx.DeviceMissing.inputPortIgnored),a.disconnectOutputDevice(b,this.outputA0),a.disconnectInputDevice(b+1,wmsx.DeviceMissing.inputPortIgnored),a.disconnectOutputDevice(b+1,this.outputA1),a.disconnectInputDevice(b+2,this.inputA2),a.disconnectOutputDevice(b+2,wmsx.DeviceMissing.outputPortIgnored),audioChannel.disconnectAudio()},this.setAudioSocket=function(a){audioChannel.setAudioSocket(a)},this.powerOn=function(){this.reset(),powerIsOn=!0,audioChannel.powerOn()},this.powerOff=function(){powerIsOn=!1,this.reset(),audioChannel.powerOff()},this.reset=function(){wmsx.Util.arrayFill(register,0),register[15]=143,updateKanaLed(),audioChannel.reset()},this.getAudioChannel=function(){return audioChannel},this.outputA0=function(a){registerAddress=a>15?0:a},this.outputA1=function(a){switch(register[registerAddress]=a,registerAddress){case 0:case 1:audioChannel.setPeriodA((15®ister[1])<<8|register[0]);break;case 2:case 3:audioChannel.setPeriodB((15®ister[3])<<8|register[2]);break;case 4:case 5:audioChannel.setPeriodC((15®ister[5])<<8|register[4]);break;case 6:audioChannel.setPeriodN(31&a);break;case 7:audioChannel.setMixerControl(a);break;case 8:audioChannel.setAmplitudeA(a);break;case 9:audioChannel.setAmplitudeB(a);break;case 10:audioChannel.setAmplitudeC(a);break;case 11:case 12:audioChannel.setPeriodE(register[12]<<8|register[11]);break;case 13: audioChannel.setEnvelopeControl(a);break;case 15:controllersSocket&&(controllersSocket.writeControllerPin8Port(0,(16&a)>>4),controllersSocket.writeControllerPin8Port(1,(32&a)>>5)),updateKanaLed()}},this.inputA2=function(){if(14!==registerAddress)return register[registerAddress];var a=register[15]>>6&1;return controllersSocket?controllersSocket.readControllerPort(a):63};var powerIsOn=!1,registerAddress=0,register=wmsx.Util.arrayFill(new Array(16),0),audioChannel=new wmsx.PSGAudio(secondary);this.saveState=function(){return{p:powerIsOn,ra:registerAddress,r:wmsx.Util.storeInt8BitArrayToStringBase64(register),ac:audioChannel.saveState()}},this.loadState=function(a){powerIsOn=void 0===a.p||a.p,registerAddress=a.ra,register=wmsx.Util.restoreStringBase64ToInt8BitArray(a.r,register),updateKanaLed(),audioChannel.loadState(a.ac)},this.eval=function(str){return eval(str)}},wmsx.AudioSignal=function(a,b,c,d,e,f){"use strict";function g(a){switch(a){case 32:return j;case 72:return k;case 81:return l;default:throw new Error("Unsupported AudioSignal Sample Rate CPU Clock multiple: "+a)}}function h(a){switch(a){case 72:return m;default:throw new Error("Unsupported AudioSignal Clock CPU Clock multiple: "+a)}}function i(){var a=H*WMSX.AUDIO_SIGNAL_BUFFER_RATIO+v*WMSX.AUDIO_SIGNAL_ADD_FRAMES&-8;F.length=a,a>C&&wmsx.Util.arrayFill(F,0,C,a),e&&(G.length=a,a>C&&wmsx.Util.arrayFill(G,0,C,a)),C=a,I.bufferSize=C,E=C-2,s.flush()}function j(){if(B>0){if(D<=0)return void(B=0);t(),--B,--D}}function k(){1&--w||8===w||(0===w&&(w=9),j())}function l(){--x,1&x&&j(),0===x&&(x=5)}function m(){1&--y||8===y||(0===y&&(y=9),b.audioClockPulse())}function n(){F[z]=b.nextSample()*c,++z>=C&&(z=0)}function o(){var a=b.nextSample();F[z]=a[0]*c,G[z]=a[1]*c,++z>=C&&(z=0)}function p(){F[z]=0,++z>=C&&(z=0)}function q(){F[z]=G[z]=0,++z>=C&&(z=0)}function r(a,b){if(b)for(var c=a;c>0;c-=1)u();else for(var d=a;d>0;d-=1)t();D-=a}var s=this;this.audioClockPulse=null,this.flush=function(){z=0,A=0,D=E},this.setFps=function(a){v=Math.floor(d/a),i()},this.audioFinishFrame=function(){if(B>0)for(;B>0;)j();B=v},this.retrieveSamples=function(a,b){var c=E-D,d=a-c;d>-4&&(d+4>D&&(d=D-4),r(d+4,b)),I.start=A;var e=c+d;return D+=e,A+=e,A>=C&&(A-=C),I},this.getSampleRate=function(){return d},this.toString=function(){return"AudioSignal "+a},this.setAudioMonitorBufferSize=function(a){H=a,i()};var t=n,u=p;this.name=a;var v,w=9,x=5,y=9,z=0,A=0,B=0,C=0,D=0,E=0,F=wmsx.Util.arrayFill(new Array(C),0),G=e?wmsx.Util.arrayFill(new Array(C),0):F,H=0,I={stereo:e,buffer0:F,buffer1:G,bufferSize:C,start:0};!function(){c=1.2*c*WMSX.VOL,t=e?o:n,u=e?q:p;var a=Math.floor(wmsx.Machine.BASE_CPU_CLOCK/d),b=g(a);if(f){a=Math.floor(wmsx.Machine.BASE_CPU_CLOCK/f);var i=h(a);s.audioClockPulse=function(){i(),b()}}else s.audioClockPulse=b}()},wmsx.PSGAudio=function(a){"use strict";function b(a,b){a^b&&(L=!L),I=L?0:15,J=b?0:L?1:-1}function c(){o&&(l=T[I]),v&&(s=T[I]),C&&(z=T[I])}function d(){return 1&(R=R>>1|(1&(R>>2^1&R))<<16)}function e(){for(var a=0;a<16;a++)T[a]=(Math.pow(X,a/15)-1)/(X-1)*W}var f=this;this.setAudioSocket=function(a){h=a},this.powerOn=function(){this.reset(),this.connectAudio()},this.powerOff=function(){this.disconnectAudio()},this.reset=function(){this.setMixerControl(255),this.setAmplitudeA(0),this.setAmplitudeB(0),this.setAmplitudeC(0),O=!1,P=0,Q=0},this.nextSample=function(){if(i>0&&(j+=2)>=i&&(j=j-i&1,k=k?0:1),p>0&&(q+=2)>=p&&(q=q-p&1,r=r?0:1),w>0&&(x+=2)>=w&&(x=x-w&1,y=y?0:1),(n||u||B)&&(E+=1)>=D&&(E=0,F=d()),0!==J&&(H+=1)>=G&&(H=0,I+=J,(I<0||I>15)&&(K?b(M,N):(L=!0,b(!0,!0))),c()),ba){var a=0===l||m&&!k||n&&!F?0:l,e=0===s||t&&!r||u&&!F?0:s,f=0===z||A&&!y||B&&!F?0:z,g=0;return Q&&(g=W,!O&&h.getBUSCycles()-P>=Y&&(Q=0)),S[0]=a*U[0]+e*U[1]+f*U[2]+g*U[3],S[1]=a*V[0]+e*V[1]+f*V[2]+g*V[3],S}var o=(0===l||m&&!k||n&&!F?0:l)+(0===s||t&&!r||u&&!F?0:s)+(0===z||A&&!y||B&&!F?0:z);return Q&&(o+=W,!O&&h.getBUSCycles()-P>=Y&&(Q=0)),o},this.setPeriodA=function(a){i!==a&&(a<2?(i=0,k=1):i=a)},this.setPeriodB=function(a){p!==a&&(a<2?(p=0,r=1):p=a)},this.setPeriodC=function(a){w!==a&&(a<2?(w=0,y=1):w=a)},this.setPeriodN=function(a){D!==a&&(D=a<1?1:a)},this.setPeriodE=function(a){G!==a&&(G=a<1?1:a)},this.setAmplitudeA=function(a){16&a?(o=!0,l=T[I]):(o=!1,l=T[15&a])},this.setAmplitudeB=function(a){16&a?(v=!0,s=T[I]):(v=!1,s=T[15&a])},this.setAmplitudeC=function(a){16&a?(C=!0,z=T[I]):(C=!1,z=T[15&a])},this.setMixerControl=function(a){m=0==(1&a),n=0==(8&a),t=0==(2&a),u=0==(16&a),A=0==(4&a),B=0==(32&a)},this.setEnvelopeControl=function(a){K=(8&a)>0,L=(4&a)>0,M=(2&a)>0,N=(1&a)>0,b(!1,!1),c()},this.setPulseSignal=function(a){O=a,a&&(P=h.getBUSCycles(),Q=1)},this.connectAudio=function(){h&&(g||(g=new wmsx.AudioSignal("PSG"+(a?"2":""),f,Z,$,ba)),h.connectAudioSignal(g))},this.disconnectAudio=function(){h&&g&&h.disconnectAudioSignal(g)};var g,h,i=0,j=0,k=0,l=0,m=!1,n=!1,o=!1,p=0,q=0,r=0,s=0,t=!1,u=!1,v=!1,w=0,x=0,y=0,z=0,A=!1,B=!1,C=!1,D=1,E=1,F=0,G=1,H=1,I=0,J=0,K=!1,L=!1,M=!1,N=!1,O=!1,P=0,Q=0,R=131070,S=[0,0],T=new Array(16),U=new Array(4),V=new Array(4),W=.25,X=30,Y=160,Z=.66,$=112005,_=(a&&WMSX.PSG2_VOL||WMSX.PSG_VOL||"f").toUpperCase(),aa=(a&&WMSX.PSG2_PAN||WMSX.PSG_PAN||"0").toUpperCase(),ba="F"!==_||"8"!==aa;this.saveState=function(){return{pa:i,pac:j,ca:k,aa:l,ta:m,na:n,ea:o,pb:p,pbc:q,cb:r,ab:s,tb:t,nb:u,eb:v,pc:w,pcc:x,cc:y,ac:z,tc:A,nc:B,ec:C,pn:D,pnc:E,cn:F,pe:G,pec:H,ce:I,de:J,cne:K,ate:L,ale:M,he:N,ps:O,lf:R}},this.loadState=function(a){i=a.pa,j=a.pac,k=a.ca,l=a.aa,m=a.ta,n=a.na,o=a.ea,p=a.pb,q=a.pbc,r=a.cb,s=a.ab,t=a.tb,u=a.nb,v=a.eb,w=a.pc,x=a.pcc,y=a.cc,z=a.ac,A=a.tc,B=a.nc,C=a.ec,D=a.pn,E=a.pnc,F=a.cn,G=a.pe,H=a.pec,I=a.ce,J=a.de,K=a.cne,L=a.ate,M=a.ale,N=a.he,O=a.ps,P=0,Q=O?1:0,R=a.lf},function(){e(),ba&&wmsx.AudioTables.setupVolPan(4,_,aa,U,V)}()},wmsx.PCM8BitAudio=function(){"use strict";this.setAudioSocket=function(a){c=a},this.connectAudio=function(){b||(b=new wmsx.AudioSignal("PCM 8 bit",this,e,f)),c&&c.connectAudioSignal(b)},this.disconnectAudio=function(){b&&c&&c.disconnectAudioSignal(b)},this.reset=function(){a=0},this.setSampleValue=function(b){a=b-128},this.nextSample=function(){return a*d};var a,b,c,d=.25/128,e=.66,f=112005;this.saveState=function(){return{s:a}},this.loadState=function(b){a=b.s}},wmsx.SCCIAudio=function(){"use strict";function a(a,b){if((a&=255)<128)return U[a>>>5][31&a]=b<128?b:-256+b,void(a>>>5==3&&(O[31&a]=b<128?b:-256+b));if(a<160){if((a&=239)<138)return void f(a-128>>>1,b,1&a);if(a<143)return void e(a-138,15&b);g(b)}}function b(a){return a&=255,a<128?255&U[a>>>5][31&a]:255}function c(a,b){if((a&=255)<160)return void(U[a>>>5][31&a]=b<128?b:-256+b);if(a<192){if((a&=239)<170)return void f(a-160>>>1,b,1&a);if(a<175)return void e(a-170,15&b);g(b)}}function d(a){return a&=255,a<160?255&U[a>>>5][31&a]:255}function e(a,b){switch(a){case 0:r=W[b];break;case 1:y=W[b];break;case 2:F=W[b];break;case 3:M=W[b];break;case 4:T=W[b]}}function f(a,b,c){switch(a){case 0:n=c?255&n|(15&b)<<8:65280&n|b;break;case 1:u=c?255&u|(15&b)<<8:65280&u|b;break;case 2:B=c?255&B|(15&b)<<8:65280&B|b;break;case 3:I=c?255&I|(15&b)<<8:65280&I|b;break;case 4:P=c?255&P|(15&b)<<8:65280&P|b}}function g(a){l=1&a?1:0,s=2&a?1:0,z=4&a?1:0,G=8&a?1:0,N=16&a?1:0}function h(){for(var a=0;a<16;a++)W[a]=(Math.pow($,a/15)-1)/($-1)*Z}this.setAudioSocket=function(a){k=a},this.connectAudio=function(){j||(j=new wmsx.AudioSignal("SCC",this,_,aa,da)),k&&k.connectAudioSignal(j)},this.disconnectAudio=function(){j&&k&&k.disconnectAudioSignal(j)},this.reset=function(){this.disconnectAudio(),g(0),r=y=F=M=T=0,n=u=B=I=P=0,o=v=C=J=Q=0,p=w=D=K=R=0,q=x=E=L=S=0;for(var a=0;a<5;a++)wmsx.Util.arrayFill(U[a],0);this.setSCCIMode(!1)},this.setSCCIMode=function(e){i!==e&&(i=!!e,i?(this.read=d,this.write=c):(this.read=b,this.write=a))},this.nextSample=function(){var a=0,b=0,c=0,d=0,e=0;if(n>0)for(l&&(a=q*r),o+=32;o>=n;)o-=n,++p>31&&(p=0),q=m[p];if(u>0)for(s&&(b=x*y), v+=32;v>=u;)v-=u,++w>31&&(w=0),x=t[w];if(B>0)for(z&&(c=E*F),C+=32;C>=B;)C-=B,++D>31&&(D=0),E=A[D];if(I>0)for(G&&(d=L*M),J+=32;J>=I;)J-=I,++K>31&&(K=0),L=H[K];if(P>0)for(N&&(e=S*T),Q+=32;Q>=P;)Q-=P,++R>31&&(R=0),S=O[R];return da?(V[0]=a*X[0]+b*X[1]+c*X[2]+d*X[3]+e*X[4],V[1]=a*Y[0]+b*Y[1]+c*Y[2]+d*Y[3]+e*Y[4],V):a+b+c+d+e};var i,j,k,l=0,m=wmsx.Util.arrayFill(new Array(32),0),n=0,o=0,p=0,q=0,r=0,s=0,t=wmsx.Util.arrayFill(new Array(32),0),u=0,v=0,w=0,x=0,y=0,z=0,A=wmsx.Util.arrayFill(new Array(32),0),B=0,C=0,D=0,E=0,F=0,G=0,H=wmsx.Util.arrayFill(new Array(32),0),I=0,J=0,K=0,L=0,M=0,N=!1,O=wmsx.Util.arrayFill(new Array(32),0),P=0,Q=0,R=0,S=0,T=0,U=[m,t,A,H,O],V=[0,0],W=new Array(16),X=new Array(5),Y=new Array(5),Z=.23/128,$=3,_=.65,aa=112005,ba=(WMSX.SCC_VOL||"f").toUpperCase(),ca=(WMSX.SCC_PAN||"8").toUpperCase(),da="F"!==ba||"8"!==ca;this.saveState=function(){return{m:i,c1:l,p1:n,pc1:o,sc1:p,cs1:q,a1:r,c2:s,p2:u,pc2:v,sc2:w,cs2:x,a2:y,c3:z,p3:B,pc3:C,sc3:D,cs3:E,a3:F,c4:G,p4:I,pc4:J,sc4:K,cs4:L,a4:M,c5:N,p5:P,pc5:Q,sc5:R,cs5:S,a5:T,s1:wmsx.Util.storeInt8BitArrayToStringBase64(m),s2:wmsx.Util.storeInt8BitArrayToStringBase64(t),s3:wmsx.Util.storeInt8BitArrayToStringBase64(A),s4:wmsx.Util.storeInt8BitArrayToStringBase64(H),s5:wmsx.Util.storeInt8BitArrayToStringBase64(O)}},this.loadState=function(a){this.reset(),l=a.c1,n=a.p1,o=a.pc1,p=a.sc1,q=a.cs1,r=a.a1,s=a.c2,u=a.p2,v=a.pc2,w=a.sc2,x=a.cs2,y=a.a2,z=a.c3,B=a.p3,C=a.pc3,D=a.sc3,E=a.cs3,F=a.a3,G=a.c4,I=a.p4,J=a.pc4,K=a.sc4,L=a.cs4,M=a.a4,N=a.c5,P=a.p5,Q=a.pc5,R=a.sc5,S=a.cs5,T=a.a5,m=wmsx.Util.restoreStringBase64ToSignedInt8BitArray(a.s1,m),t=wmsx.Util.restoreStringBase64ToSignedInt8BitArray(a.s2,t),A=wmsx.Util.restoreStringBase64ToSignedInt8BitArray(a.s3,A),H=wmsx.Util.restoreStringBase64ToSignedInt8BitArray(a.s4,H),O=wmsx.Util.restoreStringBase64ToSignedInt8BitArray(a.s5||a.s4,O),U[0]!==m&&(U[0]=m),U[1]!==t&&(U[1]=t),U[2]!==A&&(U[2]=A),U[3]!==H&&(U[3]=H),U[4]!==O&&(U[4]=O),this.setSCCIMode(!0===a.m)},function(a){h(),da&&wmsx.AudioTables.setupVolPan(5,ba,ca,X,Y),a.setSCCIMode(!1)}(this)},wmsx.YM2413Tables=function(){"use strict";this.getFullSineTable=function(){for(var a=new Array(1024),b=0;b<1024;++b)a[b]=(b>511?16384:0)|Math.round(256*-wmsx.Util.log2(Math.abs(Math.sin(2*(b+.5)*Math.PI/1024))));return a},this.getHalfSineTable=function(){for(var a=new Array(1024),b=0;b<1024;++b)a[b]=Math.round(256*-wmsx.Util.log2(Math.abs(Math.sin(2*(b<512?b+.5:.5)*Math.PI/1024))));return a},this.getExpTable=function(){for(var a=new Array(32768),b=0;b<32768;++b){var c=Math.round(1024*wmsx.Util.exp2((255&b^255)/256))<<1>>Math.min((16128&b)>>8,31);16384&b&&(c=-c),a[b]=c}return a},this.getInstrumentsROM=function(){return this.INSTRUMENT_ROM},this.getVIBValues=function(){return this.VIB_VALUES},this.getKSLValues=function(){return this.KSL_VALUES},this.getMultiFactorsDoubled=function(){return this.MULTI_FACTORS},this.getRateDecayDurations=function(){for(var a=new Array(76),b=0;b<64;++b){var c=this.RATE_DECAY_DURATIONS[b];a[b]=c>=0?Math.max(1,Math.round(c/1e3*49780/128)):0}for(b=64;b<76;++b)a[b]=a[63];return a},this.getRateAttackDurations=function(){for(var a=new Array(76),b=0;b<64;++b){var c=this.RATE_ATTACK_DURATIONS[b];a[b]=c>=0?Math.max(1,Math.round(c/1e3*49780/128*8)):0}for(b=64;b<76;++b)a[b]=a[63];return a},this.INSTRUMENT_ROM=[[0,0,0,0,0,0,0,0],[97,97,30,23,240,127,0,23],[19,65,22,14,253,244,35,35],[3,1,154,4,243,243,19,243],[17,97,14,7,250,100,112,23],[34,33,30,6,240,118,0,40],[33,34,22,5,240,113,0,24],[33,97,29,7,130,128,23,23],[35,33,45,22,144,144,0,7],[33,33,27,6,100,101,16,23],[33,33,11,26,133,160,112,7],[35,1,131,16,255,180,16,244],[151,193,32,7,255,244,34,34],[97,0,12,5,194,246,64,68],[1,1,86,3,148,194,3,18],[33,1,137,3,241,228,240,35],[1,1,20,0,253,248,111,141],[1,17,0,0,248,247,248,247],[5,17,0,0,248,250,248,85]],this.VIB_VALUES=[[0,0,0,0,0,0,0,0],[0,0,1,0,0,0,-1,0],[0,1,2,1,0,-1,-2,-1],[0,1,3,1,0,-1,-3,-1],[0,2,4,2,0,-2,-4,-2],[0,2,5,2,0,-2,-5,-2],[0,3,6,3,0,-3,-6,-3],[0,3,7,3,0,-3,-7,-3]],this.KSL_VALUES=[[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,1,1,2,2,3,3,4],[0,0,0,0,0,1,2,3,4,5,5,6,6,7,7,8],[0,0,0,2,4,5,6,7,8,9,9,10,10,11,11,12],[0,0,4,6,8,9,10,11,12,13,13,14,14,15,15,16],[0,4,8,10,12,13,14,15,16,17,17,18,18,19,19,20],[0,8,12,14,16,17,18,19,20,21,21,22,22,23,23,24],[0,12,16,18,20,21,22,23,24,25,25,26,26,27,27,28]],[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,2,3,4,5,6,7,8],[0,0,0,0,0,3,5,7,8,10,11,12,13,14,15,16],[0,0,0,5,8,11,13,15,16,18,19,20,21,22,23,24],[0,0,8,13,16,19,21,23,24,26,27,28,29,30,31,32],[0,8,16,21,24,27,29,31,32,34,35,36,37,38,39,40],[0,16,24,29,32,35,37,39,40,42,43,44,45,46,47,48],[0,24,32,37,40,43,45,47,48,50,51,52,53,54,55,56]],[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,4,6,8,10,12,14,16],[0,0,0,0,0,6,10,14,16,20,22,24,26,28,30,32],[0,0,0,10,16,22,26,30,32,36,38,40,42,44,46,48],[0,0,16,26,32,38,42,46,48,52,54,56,58,60,62,64],[0,16,32,42,48,54,58,62,64,68,70,72,74,76,78,80],[0,32,48,58,64,70,74,78,80,84,86,88,90,92,94,96],[0,48,64,74,80,86,90,94,96,100,102,104,106,108,110,112]]],this.MULTI_FACTORS=[1,2,4,6,8,10,12,14,16,18,20,20,24,24,30,30],this.RATE_DECAY_DURATIONS=[-1,-1,-1,-1,20926.6,16807.2,14006,12028.7,10463.3,8403.58,7002.98,6014.32,5231.64,4201.79,3501.49,3007.16,2615.82,2100.89,1750.75,1503.58,1307.91,1050.45,875.37,751.79,653.95,525.22,437.69,375.9,326.98,262.61,218.84,187.95,163.49,131.31,109.42,93.97,81.74,65.65,54.71,46.99,40.87,32.83,27.36,23.49,20.44,16.41,13.68,11.75,10.22,8.21,6.84,5.87,5.11,4.1,3.42,2.94,2.55,2.05,1.71,1.47,1.27,1.27,1.27,1.27],this.RATE_ATTACK_DURATIONS=[-1,-1,-1,-1,1730.15,1400.6,1153.43,988.66,865.08,700.3,576.72,494.33,432.54,350.15,288.36,247.16,216.27,175.07,144.18,123.58,108.13,87.54,72.09,61.79,54.07,43.77,36.04,30.9,27.03,21.88,18.02,15.45,13.52,10.94,9.01,7.72,6.76,5.47,4.51,3.86,3.38,2.74,2.25,1.93,1.69,1.37,1.13,.97,.84,.7,.6,.54,.5,.42,.34,.3,.28,.22,.18,.14,0,0,0,0]},wmsx.YM2413Audio=function(pName){"use strict";function init(){name=pName||"YM2413";var a=new wmsx.YM2413Tables;sineTable=a.getFullSineTable(),halfSineTable=a.getHalfSineTable(),expTable=a.getExpTable(),instrumentsParameters=a.getInstrumentsROM(),multiFactors=a.getMultiFactorsDoubled(),vibValues=a.getVIBValues(),kslValues=a.getKSLValues(),rateAttackDurTable=a.getRateAttackDurations(),rateDecayDurTable=a.getRateDecayDurations(),VOLPAN&&wmsx.AudioTables.setupVolPan(14,VOL,PAN,volPanL,volPanR)}function connectAudio(){audioSocket&&(audioSignal||(audioSignal=new wmsx.AudioSignal(name,self,VOLUME,SAMPLE_RATE,VOLPAN)),audioSocket.connectAudioSignal(audioSignal),audioConnected=!0)}function disconnectAudio(){audioSocket&&audioSignal&&audioSocket.disconnectAudioSignal(audioSignal),audioConnected=!1}function registerWrite(a,b){var c=15&a;c>8&&(c-=9);var d=c<<1,e=d+1,f=register[a]^b;switch(register[a]=b,a){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:f&&(instrumentsParameters[0][a]=b,updateCustomInstrChannels());break;case 14:32&f&&setRhythmMode(0!=(32&b)),rhythmMode&&(48&f&&(setRhythmKeyOnOp(12,(16&b)>>4),setRhythmKeyOnOp(13,(16&b)>>4)),40&f&&setRhythmKeyOnOp(15,(8&b)>>3),36&f&&setRhythmKeyOnOp(16,(4&b)>>2),34&f&&setRhythmKeyOnOp(17,(2&b)>>1),33&f&&setRhythmKeyOnOp(14,1&b));break;case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:f&&(fNum[d]=-256&fNum[d]|b,fNum[e]=fNum[d],updateFrequency(c));break;case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:32&f&&setSustain(c,(32&b)>>5),16&f&&!(rhythmMode&&c>5)&&setKeyOn(c,(16&b)>>4), 1&f&&(fNum[d]=-257&fNum[d]|(1&b)<<8,fNum[e]=fNum[d]),14&f&&(block[d]=b>>1&7,block[e]=block[d]),15&f&&updateFrequency(c);break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 58:case 59:case 60:case 61:case 62:case 63:rhythmMode&&c>5?(240&f&&c>6&&setVolumeOp(d,b>>>4),15&f&&setVolumeOp(e,15&b)):(240&f&&(audioConnected||connectAudio(),setInstr(c,b>>>4)),15&f&&setVolumeOp(e,15&b))}}function clockNoise(){noiseRegister>>=1,(noiseOutput=1&noiseRegister)&&(noiseRegister^=134230048)}function clockAM(){return!(511&clock)&&(0!==amLevel&&13!==amLevel||(amLevelInc=-amLevelInc),amLevel+=amLevelInc,!0)}function clockVIB(){return!(1023&clock)&&(vibPhase=clock>>10&7,!0)}function clockEnvelope(a){envLevel[a]===envStepNextAtLevel[a]?setEnvStepOp(a,envStepNext[a]):clock===envStepLevelIncClock[a]&&(envStepLevelIncClock[a]+=envStepLevelDur[a],envLevel[a]+=envStepLevelInc[a],updateEnvAttenuationOp(a))}function setSustain(a,b){sustain[a]=b}function setKeyOn(a,b){var c=a<<1,d=c+1;keyOn[c]=b,keyOn[d]=b,b?setEnvStep(a,DAMP):envStep[d]!==IDLE&&setEnvStepOp(d,RELEASE)}function setRhythmKeyOnOp(a,b){keyOn[a]=b,b?setEnvStepOp(a,DAMP):envStep[a]!==IDLE&&setEnvStepOp(a,RELEASE)}function setEnvStep(a,b){var c=a<<1,d=c+1;setEnvStepOp(c,b),setEnvStepOp(d,b)}function setEnvStepOp(a,b){switch(envStep[a]=b,b){case DAMP:envStepLevelDur[a]=rateDecayDurTable[48+ksrOffset[a]],envStepLevelIncClock[a]=clock+envStepLevelDur[a],envStepLevelInc[a]=1,envStepNextAtLevel[a]=128,envStepNext[a]=ATTACK;break;case ATTACK:envStepLevelDur[a]=rateAttackDurTable[(ar[a]<<2)+ksrOffset[a]],envStepLevelIncClock[a]=clock+envStepLevelDur[a],envStepLevelInc[a]=-8,envStepNextAtLevel[a]=0,envStepNext[a]=DECAY,phaseCounter[a]=0;break;case DECAY:envStepLevelDur[a]=rateDecayDurTable[(dr[a]<<2)+ksrOffset[a]],envStepLevelIncClock[a]=clock+envStepLevelDur[a],envStepLevelInc[a]=1,envStepNextAtLevel[a]=sl[a]<<3,envStepNext[a]=SUSTAIN;break;case SUSTAIN:envType[a]?(envStepLevelIncClock[a]=envStepLevelDur[a]=0,envStepLevelInc[a]=0,envStepNextAtLevel[a]=255,envStepNext[a]=SUSTAIN):(envStepLevelDur[a]=rateDecayDurTable[(rr[a]<<2)+ksrOffset[a]],envStepLevelIncClock[a]=clock+envStepLevelDur[a],envStepLevelInc[a]=1,envStepNextAtLevel[a]=128,envStepNext[a]=IDLE);break;case RELEASE:var c=envType[a]?sustain[a>>1]?5:rr[a]:sustain[a>>1]?5:7;envStepLevelDur[a]=rateDecayDurTable[(c<<2)+ksrOffset[a]],envStepLevelIncClock[a]=clock+envStepLevelDur[a],envStepLevelInc[a]=1,envStepNextAtLevel[a]=128,envStepNext[a]=IDLE;break;case IDLE:default:envLevel[a]=128,envStepLevelIncClock[a]=envStepLevelDur[a]=0,envStepLevelInc[a]=0,envStepNextAtLevel[a]=255,envStepNext[a]=IDLE}}function setRhythmMode(a){rhythmMode=a,rhythmMode?(audioConnected||connectAudio(),setInstr(6,16),setInstr(7,17),setInstr(8,18)):(setEnvStep(6,IDLE),updateEnvAttenuation(6),setEnvStep(7,IDLE),updateEnvAttenuation(7),setEnvStep(8,IDLE),updateEnvAttenuation(8),setInstr(6,register[36]>>4),setInstr(7,register[37]>>4),setInstr(8,register[38]>>4))}function setInstr(a,b){instr[a]=b;var c=a<<1,d=c+1,e=instrumentsParameters[b];am[c]=e[0]>>7&1,am[d]=e[1]>>7&1,vib[c]=e[0]>>6&1,vib[d]=e[1]>>6&1,envType[c]=e[0]>>5&1,envType[d]=e[1]>>5&1,ksr[c]=e[0]>>4&1,ksr[d]=e[1]>>4&1,multi[c]=multiFactors[15&e[0]],multi[d]=multiFactors[15&e[1]],ksl[c]=e[2]>>6,ksl[d]=e[3]>>6,modTL[c]=63&e[2],halfWave[c]=e[3]>>3&1,halfWave[d]=e[3]>>4&1,fbShift[a]=7&e[3]?8-(7&e[3]):0,ar[c]=e[4]>>4,ar[d]=e[5]>>4,dr[c]=15&e[4],dr[d]=15&e[5],sl[c]=e[6]>>4,sl[d]=e[7]>>4,rr[c]=15&e[6],rr[d]=15&e[7],updateAMAttenuation(a),updateFrequency(a),updateModAttenuationOp(c)}function updateCustomInstrChannels(){for(var a=0;a<9;a++)0===instr[a]&&setInstr(a,0)}function setVolumeOp(a,b){volume[a]=b,updateVolumeAttenuationOp(a)}function updateFrequency(a){var b=a<<1,c=b+1,d=vib[b]?vibValues[fNum[b]>>6][vibPhase]:0;phaseInc[b]=((fNum[b]<<1)+d)*multi[b]<>2,d=vib[c]?vibValues[fNum[c]>>6][vibPhase]:0,phaseInc[c]=((fNum[c]<<1)+d)*multi[c]<>2,updateKSLAttenuation(a),updateKSROffset(a)}function updateFrequencyOp(a){var b=vib[a]?vibValues[fNum[a]>>6][vibPhase]:0;phaseInc[a]=((fNum[a]<<1)+b)*multi[a]<>2,updateKSLAttenuationOp(a),updateKSROffsetOp(a)}function updateKSROffset(a){var b=a<<1,c=b+1;ksrOffset[b]=(ksr[b]?block[b]<<1:block[b]>>1)|fNum[b]>>>9-ksr[b],ksrOffset[c]=(ksr[c]?block[c]<<1:block[c]>>1)|fNum[c]>>>9-ksr[c]}function updateKSROffsetOp(a){ksrOffset[a]=(ksr[a]?block[a]<<1:block[a]>>1)|fNum[a]>>>9-ksr[a]}function updateAMAttenuation(a){var b=a<<1,c=b+1;amAtt[b]=am[b]?amLevel<<4:0,amAtt[c]=am[c]?amLevel<<4:0,updateTotalAttenuation(a)}function updateAMAttenuationOp(a){amAtt[a]=am[a]?amLevel<<4:0,updateTotalAttenuationOp(a)}function updateKSLAttenuation(a){var b=a<<1,c=b+1;kslAtt[b]=kslValues[ksl[b]][block[b]][fNum[b]>>>5]<<4,kslAtt[c]=kslValues[ksl[c]][block[c]][fNum[c]>>>5]<<4,updateTotalAttenuation(a)}function updateKSLAttenuationOp(a){kslAtt[a]=kslValues[ksl[a]][block[a]][fNum[a]>>>5]<<4,updateTotalAttenuationOp(a)}function updateEnvAttenuation(a){var b=a<<1,c=b+1;envAtt[b]=(128===envLevel[b]?256:envLevel[b])<<4,envAtt[c]=(128===envLevel[c]?256:envLevel[c])<<4,updateTotalAttenuation(a)}function updateEnvAttenuationOp(a){envAtt[a]=(128===envLevel[a]?256:envLevel[a])<<4,updateTotalAttenuationOp(a)}function updateModAttenuationOp(a){volModAtt[a]=modTL[a]<<5,updateTotalAttenuationOp(a)}function updateVolumeAttenuationOp(a){volModAtt[a]=(15===volume[a]?30:volume[a])<<7,updateTotalAttenuationOp(a)}function updateTotalAttenuation(a){var b=a<<1,c=b+1;totalAtt[b]=amAtt[b]+kslAtt[b]+envAtt[b]+volModAtt[b],totalAtt[c]=amAtt[c]+kslAtt[c]+envAtt[c]+volModAtt[c]}function updateTotalAttenuationOp(a){totalAtt[a]=amAtt[a]+kslAtt[a]+envAtt[a]+volModAtt[a]}var self=this;this.connect=function(a){a.bus.connectInputDevice(124,wmsx.DeviceMissing.inputPortIgnored),a.bus.connectInputDevice(125,wmsx.DeviceMissing.inputPortIgnored),a.bus.connectOutputDevice(124,this.output7C),a.bus.connectOutputDevice(125,this.output7D),audioSocket=a.getAudioSocket(),audioConnected&&connectAudio()},this.disconnect=function(a){a.bus.disconnectInputDevice(124,wmsx.DeviceMissing.inputPortIgnored),a.bus.disconnectInputDevice(125,wmsx.DeviceMissing.inputPortIgnored),a.bus.disconnectOutputDevice(124,this.output7C),a.bus.disconnectOutputDevice(125,this.output7D),disconnectAudio(),audioSocket=null},this.powerOn=function(){this.reset()},this.powerOff=function(){disconnectAudio()},this.reset=function(){registerAddress=0,wmsx.Util.arrayFill(register,0),wmsx.Util.arrayFill(instrumentsParameters[0],0),clock=0,noiseRegister=65535,noiseOutput=0,amLevel=0,amLevelInc=-1,vibPhase=0,rhythmMode=!1,wmsx.Util.arrayFill(sustain,0),wmsx.Util.arrayFill(instr,0),wmsx.Util.arrayFill(keyOn,0),wmsx.Util.arrayFill(am,0),wmsx.Util.arrayFill(vib,0),wmsx.Util.arrayFill(envType,0),wmsx.Util.arrayFill(ksr,0),wmsx.Util.arrayFill(multi,0),wmsx.Util.arrayFill(ksl,0),wmsx.Util.arrayFill(halfWave,0),wmsx.Util.arrayFill(ar,0),wmsx.Util.arrayFill(dr,0),wmsx.Util.arrayFill(sl,0),wmsx.Util.arrayFill(rr,0),wmsx.Util.arrayFill(fNum,0),wmsx.Util.arrayFill(block,0),wmsx.Util.arrayFill(volume,0),wmsx.Util.arrayFill(modTL,0),wmsx.Util.arrayFill(fbShift,0),wmsx.Util.arrayFill(volModAtt,0),wmsx.Util.arrayFill(amAtt,0),wmsx.Util.arrayFill(envAtt,0),wmsx.Util.arrayFill(kslAtt,0),wmsx.Util.arrayFill(totalAtt,0),wmsx.Util.arrayFill(envStep,IDLE),wmsx.Util.arrayFill(envStepLevelDur,0),wmsx.Util.arrayFill(envStepLevelIncClock,0),wmsx.Util.arrayFill(envStepLevelInc,0),wmsx.Util.arrayFill(envStepNext,DAMP),wmsx.Util.arrayFill(envStepNextAtLevel,0),wmsx.Util.arrayFill(envLevel,0),wmsx.Util.arrayFill(ksrOffset,0),wmsx.Util.arrayFill(fbLastMod1,0),wmsx.Util.arrayFill(fbLastMod2,0),wmsx.Util.arrayFill(phaseInc,0),wmsx.Util.arrayFill(phaseCounter,0),disconnectAudio()},this.output7C=function(a){registerAddress=63&a},this.output7D=function(a){registerWrite(registerAddress,a)}, this.nextSample=function(){var a,b,c,d,e,f,g=!1;++clock,(a=clockAM())&&(g=clockVIB());for(var h=0,i=0,j=0,k=0,l=rhythmMode?5:8,m=l;m>=0;--m)b=m<<1,c=b+1,envStep[c]!==IDLE&&(a&&(am[b]&&updateAMAttenuationOp(b),am[c]&&updateAMAttenuationOp(c),g&&(vib[b]&&updateFrequencyOp(b),vib[c]&&updateFrequencyOp(c))),envStep[b]!==IDLE&&clockEnvelope(b),clockEnvelope(c),d=(phaseCounter[b]+=phaseInc[b])>>9,e=(phaseCounter[c]+=phaseInc[c])>>9,fbShift[m]?(d+=fbLastMod1[m]+fbLastMod2[m]>>fbShift[m],f=expTable[(halfWave[b]?halfSineTable:sineTable)[1023&d]+totalAtt[b]],fbLastMod2[m]=fbLastMod1[m]>>1,fbLastMod1[m]=f>>1):f=expTable[(halfWave[b]?halfSineTable:sineTable)[1023&d]+totalAtt[b]],h=expTable[(halfWave[c]?halfSineTable:sineTable)[e+f&1023]+totalAtt[c]]>>4,VOLPAN?(i+=h*volPanL[m],j+=h*volPanR[m]):k+=h);if(rhythmMode&&(clockNoise(),c=13,envStep[c]!==IDLE&&(b=12,clockEnvelope(b),clockEnvelope(c),d=((phaseCounter[b]+=phaseInc[b])>>9)-1,e=(phaseCounter[c]+=phaseInc[c])>>9,f=expTable[sineTable[1023&d]+totalAtt[b]],h=expTable[sineTable[e+f&1023]+totalAtt[c]]>>3,VOLPAN?(i+=h*volPanL[9],j+=h*volPanR[9]):k+=h),c=15,envStep[c]!==IDLE&&(clockEnvelope(c),e=(phaseCounter[c]+=phaseInc[c])>>9,h=expTable[sineTable[256&e?noiseOutput?0:130:noiseOutput?0:893]+totalAtt[c]]>>3,VOLPAN?(i+=h*volPanL[10],j+=h*volPanR[10]):k+=h),c=16,envStep[c]!==IDLE&&(clockEnvelope(c),e=(phaseCounter[c]+=phaseInc[c])>>9,h=expTable[sineTable[1023&e]+totalAtt[c]]>>3,VOLPAN?(i+=h*volPanL[11],j+=h*volPanR[11]):k+=h),envStep[17]!==IDLE||envStep[14]!==IDLE)){var n=(phaseCounter[14]+=phaseInc[14])>>9,o=(phaseCounter[17]+=phaseInc[17])>>9,p=(0!=(4&o)&&0==(16&o))!=(0!=(2&n)!=(0!=(256&n))||0!=(4&n));c=17,envStep[c]!==IDLE&&(clockEnvelope(c),h=expTable[sineTable[p?200:823]+totalAtt[c]]>>3,VOLPAN?(i+=h*volPanL[12],j+=h*volPanR[12]):k+=h),c=14,envStep[c]!==IDLE&&(clockEnvelope(c),h=expTable[sineTable[p?noiseOutput?40:10:noiseOutput?983:1013]+totalAtt[c]]>>3,VOLPAN?(i+=h*volPanL[13],j+=h*volPanR[13]):k+=h)}return VOLPAN?(sampleResult[0]=i,sampleResult[1]=j,sampleResult):k};var name,audioConnected=!1,IDLE=255,DAMP=0,ATTACK=1,DECAY=2,SUSTAIN=3,RELEASE=4,clock,noiseRegister,noiseOutput,amLevel,amLevelInc,vibPhase,registerAddress,register=new Array(56),rhythmMode,sustain=new Array(9),instr=new Array(9),keyOn=new Array(18),am=new Array(18),vib=new Array(18),envType=new Array(18),ksr=new Array(18),multi=new Array(18),ksl=new Array(18),halfWave=new Array(18),ar=new Array(18),dr=new Array(18),sl=new Array(18),rr=new Array(18),fNum=new Array(18),block=new Array(18),volume=new Array(18),modTL=new Array(18),fbShift=new Array(9),volModAtt=new Array(18),amAtt=new Array(18),envAtt=new Array(18),kslAtt=new Array(18),totalAtt=new Array(18),envStep=new Array(18),envStepLevelDur=new Array(18),envStepLevelIncClock=new Array(18),envStepLevelInc=new Array(18),envStepNext=new Array(18),envStepNextAtLevel=new Array(18),envLevel=new Array(18),ksrOffset=new Array(18),fbLastMod1=new Array(9),fbLastMod2=new Array(9),phaseInc=new Array(18),phaseCounter=new Array(18),volPanL=new Array(14),volPanR=new Array(14),sineTable,halfSineTable,expTable,instrumentsParameters,multiFactors,vibValues,kslValues,rateAttackDurTable,rateDecayDurTable,audioSocket,audioSignal,sampleResult=[0,0],VOLUME=1.58/9/256*.68,SAMPLE_RATE=49780,VOL=(WMSX.OPLL_VOL||"f").toUpperCase(),PAN=(WMSX.OPLL_PAN||"8").toUpperCase(),VOLPAN="F"!==VOL||"8"!==PAN;this.saveState=function(){return{n:name,ac:audioConnected,ra:registerAddress,r:wmsx.Util.storeInt8BitArrayToStringBase64(register),c:clock,nr:noiseRegister,no:noiseOutput,al:amLevel,ai:amLevelInc,vp:vibPhase,amt:wmsx.Util.storeInt16BitArrayToStringBase64(amAtt),evt:wmsx.Util.storeInt16BitArrayToStringBase64(envAtt),kst:wmsx.Util.storeInt16BitArrayToStringBase64(kslAtt),tot:wmsx.Util.storeInt16BitArrayToStringBase64(totalAtt),evs:wmsx.Util.storeInt8BitArrayToStringBase64(envStep),evd:wmsx.Util.storeInt32BitArrayToStringBase64(envStepLevelDur),evc:envStepLevelIncClock,evi:wmsx.Util.storeInt8BitArrayToStringBase64(envStepLevelInc),evn:wmsx.Util.storeInt8BitArrayToStringBase64(envStepNext),evl:wmsx.Util.storeInt8BitArrayToStringBase64(envStepNextAtLevel),eve:wmsx.Util.storeInt8BitArrayToStringBase64(envLevel),kso:wmsx.Util.storeInt8BitArrayToStringBase64(ksrOffset),fb1:wmsx.Util.storeInt16BitArrayToStringBase64(fbLastMod1),fb2:wmsx.Util.storeInt16BitArrayToStringBase64(fbLastMod2)}},this.loadState=function(a){this.reset(),name=a.n,audioConnected=a.ac,registerAddress=a.ra;for(var b=wmsx.Util.restoreStringBase64ToInt8BitArray(a.r),c=0;c255&&(timer1Counter=register[2],timer1Masked||(status|=192,updateIRQ())),timer2Active&&0==(15&clock)&&++timer2Counter>255&&(timer2Counter=register[3],timer2Masked||(status|=160,updateIRQ()))}function updateIRQ(){cpu.setINTChannel(2,0==(128&status))}function connectAudio(){}function registerWrite(a,b){if(4===a&&128&b)return register[4]&=-129,status=0,void updateIRQ();var c=register[a]^b;switch(register[a]=b,a){case 4:1&c&&(timer1Active=0!=(1&b))&&(timer1Counter=register[2]),2&c&&(timer2Active=0!=(2&b))&&(timer2Counter=register[3]),64&c&&(timer1Masked=0!=(64&b)),32&c&&(timer2Masked=0!=(32&b))}}function clockNoise(){noiseRegister>>=1,(noiseOutput=1&noiseRegister)&&(noiseRegister^=134230048)}function clockAM(){return!(511&clock)&&(0!==amLevel&&13!==amLevel||(amLevelInc=-amLevelInc),amLevel+=amLevelInc,!0)}function clockVIB(){return!(1023&clock)&&(vibPhase=clock>>10&7,!0)}function clockEnvelope(a){envLevel[a]===envStepNextAtLevel[a]?setEnvStepOp(a,envStepNext[a]):clock===envStepLevelIncClock[a]&&(envStepLevelIncClock[a]+=envStepLevelDur[a],envLevel[a]+=envStepLevelInc[a],updateEnvAttenuationOp(a))}function setSustain(a,b){sustain[a]=b}function setKeyOn(a,b){var c=a<<1,d=c+1;keyOn[c]=b,keyOn[d]=b,b?setEnvStep(a,DAMP):envStep[d]!==IDLE&&setEnvStepOp(d,RELEASE)}function setRhythmKeyOnOp(a,b){keyOn[a]=b,b?setEnvStepOp(a,DAMP):envStep[a]!==IDLE&&setEnvStepOp(a,RELEASE)}function setEnvStep(a,b){var c=a<<1,d=c+1;setEnvStepOp(c,b),setEnvStepOp(d,b)}function setEnvStepOp(a,b){switch(envStep[a]=b,b){case DAMP:envStepLevelDur[a]=rateDecayDurTable[48+ksrOffset[a]],envStepLevelIncClock[a]=clock+envStepLevelDur[a],envStepLevelInc[a]=1,envStepNextAtLevel[a]=128,envStepNext[a]=ATTACK;break;case ATTACK:envStepLevelDur[a]=rateAttackDurTable[(ar[a]<<2)+ksrOffset[a]],envStepLevelIncClock[a]=clock+envStepLevelDur[a],envStepLevelInc[a]=-8,envStepNextAtLevel[a]=0,envStepNext[a]=DECAY,phaseCounter[a]=0;break;case DECAY:envStepLevelDur[a]=rateDecayDurTable[(dr[a]<<2)+ksrOffset[a]],envStepLevelIncClock[a]=clock+envStepLevelDur[a],envStepLevelInc[a]=1,envStepNextAtLevel[a]=sl[a]<<3,envStepNext[a]=SUSTAIN;break;case SUSTAIN:envType[a]?(envStepLevelIncClock[a]=envStepLevelDur[a]=0,envStepLevelInc[a]=0,envStepNextAtLevel[a]=255,envStepNext[a]=SUSTAIN):(envStepLevelDur[a]=rateDecayDurTable[(rr[a]<<2)+ksrOffset[a]],envStepLevelIncClock[a]=clock+envStepLevelDur[a],envStepLevelInc[a]=1,envStepNextAtLevel[a]=128,envStepNext[a]=IDLE);break;case RELEASE:var c=envType[a]?sustain[a>>1]?5:rr[a]:sustain[a>>1]?5:7;envStepLevelDur[a]=rateDecayDurTable[(c<<2)+ksrOffset[a]],envStepLevelIncClock[a]=clock+envStepLevelDur[a],envStepLevelInc[a]=1,envStepNextAtLevel[a]=128,envStepNext[a]=IDLE;break;case IDLE:default:envLevel[a]=128,envStepLevelIncClock[a]=envStepLevelDur[a]=0,envStepLevelInc[a]=0,envStepNextAtLevel[a]=255,envStepNext[a]=IDLE}}function setRhythmMode(a){rhythmMode=a,rhythmMode?(audioConnected||connectAudio(),setInstr(6,16),setInstr(7,17),setInstr(8,18)):(setEnvStep(6,IDLE),updateEnvAttenuation(6),setEnvStep(7,IDLE),updateEnvAttenuation(7),setEnvStep(8,IDLE),updateEnvAttenuation(8),setInstr(6,register[36]>>4),setInstr(7,register[37]>>4),setInstr(8,register[38]>>4))}function setInstr(a,b){instr[a]=b;var c=a<<1,d=c+1,e=instrumentsParameters[b];am[c]=e[0]>>7&1,am[d]=e[1]>>7&1,vib[c]=e[0]>>6&1,vib[d]=e[1]>>6&1,envType[c]=e[0]>>5&1,envType[d]=e[1]>>5&1,ksr[c]=e[0]>>4&1,ksr[d]=e[1]>>4&1,multi[c]=multiFactors[15&e[0]],multi[d]=multiFactors[15&e[1]],ksl[c]=e[2]>>6,ksl[d]=e[3]>>6,modTL[c]=63&e[2],halfWave[c]=e[3]>>3&1,halfWave[d]=e[3]>>4&1,fbShift[a]=7&e[3]?8-(7&e[3]):0,ar[c]=e[4]>>4,ar[d]=e[5]>>4,dr[c]=15&e[4],dr[d]=15&e[5],sl[c]=e[6]>>4,sl[d]=e[7]>>4,rr[c]=15&e[6],rr[d]=15&e[7],updateAMAttenuation(a),updateFrequency(a),updateModAttenuationOp(c)}function updateCustomInstrChannels(){for(var a=0;a<9;a++)0===instr[a]&&setInstr(a,0)}function setVolumeOp(a,b){volume[a]=b,updateVolumeAttenuationOp(a)}function updateFrequency(a){var b=a<<1,c=b+1,d=vib[b]?vibValues[fNum[b]>>6][vibPhase]:0;phaseInc[b]=((fNum[b]<<1)+d)*multi[b]<>2,d=vib[c]?vibValues[fNum[c]>>6][vibPhase]:0,phaseInc[c]=((fNum[c]<<1)+d)*multi[c]<>2,updateKSLAttenuation(a),updateKSROffset(a)}function updateFrequencyOp(a){var b=vib[a]?vibValues[fNum[a]>>6][vibPhase]:0;phaseInc[a]=((fNum[a]<<1)+b)*multi[a]<>2,updateKSLAttenuationOp(a),updateKSROffsetOp(a)}function updateKSROffset(a){var b=a<<1,c=b+1;ksrOffset[b]=(ksr[b]?block[b]<<1:block[b]>>1)|fNum[b]>>>9-ksr[b],ksrOffset[c]=(ksr[c]?block[c]<<1:block[c]>>1)|fNum[c]>>>9-ksr[c]}function updateKSROffsetOp(a){ksrOffset[a]=(ksr[a]?block[a]<<1:block[a]>>1)|fNum[a]>>>9-ksr[a]}function updateAMAttenuation(a){var b=a<<1,c=b+1;amAtt[b]=am[b]?amLevel<<4:0,amAtt[c]=am[c]?amLevel<<4:0,updateTotalAttenuation(a)}function updateAMAttenuationOp(a){amAtt[a]=am[a]?amLevel<<4:0,updateTotalAttenuationOp(a)}function updateKSLAttenuation(a){var b=a<<1,c=b+1;kslAtt[b]=kslValues[ksl[b]][block[b]][fNum[b]>>>5]<<4,kslAtt[c]=kslValues[ksl[c]][block[c]][fNum[c]>>>5]<<4,updateTotalAttenuation(a)}function updateKSLAttenuationOp(a){kslAtt[a]=kslValues[ksl[a]][block[a]][fNum[a]>>>5]<<4,updateTotalAttenuationOp(a)}function updateEnvAttenuation(a){var b=a<<1,c=b+1;envAtt[b]=(128===envLevel[b]?256:envLevel[b])<<4,envAtt[c]=(128===envLevel[c]?256:envLevel[c])<<4,updateTotalAttenuation(a)}function updateEnvAttenuationOp(a){envAtt[a]=(128===envLevel[a]?256:envLevel[a])<<4,updateTotalAttenuationOp(a)}function updateModAttenuationOp(a){volModAtt[a]=modTL[a]<<5,updateTotalAttenuationOp(a)}function updateVolumeAttenuationOp(a){volModAtt[a]=(15===volume[a]?30:volume[a])<<7,updateTotalAttenuationOp(a)}function updateTotalAttenuation(a){var b=a<<1,c=b+1;totalAtt[b]=amAtt[b]+kslAtt[b]+envAtt[b]+volModAtt[b],totalAtt[c]=amAtt[c]+kslAtt[c]+envAtt[c]+volModAtt[c]}function updateTotalAttenuationOp(a){totalAtt[a]=amAtt[a]+kslAtt[a]+envAtt[a]+volModAtt[a]}var self=this;this.connect=function(a){cpu=a.cpu, a.bus.connectInputDevice(196,this.inputC4),a.bus.connectOutputDevice(196,this.outputC4),a.bus.connectInputDevice(197,this.inputC5),a.bus.connectOutputDevice(197,this.outputC5),a.bus.connectInputDevice(198,wmsx.DeviceMissing.inputPortIgnored),a.bus.connectOutputDevice(198,this.outputC6),a.bus.connectInputDevice(199,this.inputC5),a.bus.connectOutputDevice(199,this.outputC5)},this.disconnect=function(a){a.bus.disconnectInputDevice(196,this.inputC4),a.bus.disconnectOutputDevice(196,this.outputC4),a.bus.disconnectInputDevice(197,this.inputC5),a.bus.disconnectOutputDevice(197,this.outputC5),a.bus.disconnectInputDevice(198,wmsx.DeviceMissing.inputPortIgnored),a.bus.disconnectOutputDevice(198,this.outputC6),a.bus.disconnectInputDevice(199,this.inputC5),a.bus.disconnectOutputDevice(199,this.outputC5)},this.reset=function(){status=0,registerAddress=0,wmsx.Util.arrayFill(register,0),clock=0,busyUntilBUSCycle=0,timer1Counter=timer2Counter=0,timer1Active=timer2Active=!1,timer1Masked=timer2Masked=0,wmsx.Util.arrayFill(instrumentsParameters[0],0),noiseRegister=65535,noiseOutput=0,amLevel=0,amLevelInc=-1,vibPhase=0,rhythmMode=!1,wmsx.Util.arrayFill(sustain,0),wmsx.Util.arrayFill(instr,0),wmsx.Util.arrayFill(keyOn,0),wmsx.Util.arrayFill(am,0),wmsx.Util.arrayFill(vib,0),wmsx.Util.arrayFill(envType,0),wmsx.Util.arrayFill(ksr,0),wmsx.Util.arrayFill(multi,0),wmsx.Util.arrayFill(ksl,0),wmsx.Util.arrayFill(halfWave,0),wmsx.Util.arrayFill(ar,0),wmsx.Util.arrayFill(dr,0),wmsx.Util.arrayFill(sl,0),wmsx.Util.arrayFill(rr,0),wmsx.Util.arrayFill(fNum,0),wmsx.Util.arrayFill(block,0),wmsx.Util.arrayFill(volume,0),wmsx.Util.arrayFill(modTL,0),wmsx.Util.arrayFill(fbShift,0),wmsx.Util.arrayFill(volModAtt,0),wmsx.Util.arrayFill(amAtt,0),wmsx.Util.arrayFill(envAtt,0),wmsx.Util.arrayFill(kslAtt,0),wmsx.Util.arrayFill(totalAtt,0),wmsx.Util.arrayFill(envStep,IDLE),wmsx.Util.arrayFill(envStepLevelDur,0),wmsx.Util.arrayFill(envStepLevelIncClock,0),wmsx.Util.arrayFill(envStepLevelInc,0),wmsx.Util.arrayFill(envStepNext,DAMP),wmsx.Util.arrayFill(envStepNextAtLevel,0),wmsx.Util.arrayFill(envLevel,0),wmsx.Util.arrayFill(ksrOffset,0),wmsx.Util.arrayFill(fbLastMod1,0),wmsx.Util.arrayFill(fbLastMod2,0),wmsx.Util.arrayFill(phaseInc,0),wmsx.Util.arrayFill(phaseCounter,0)},this.inputC4=function(){return status},this.outputC4=function(a){registerAddress=a},this.inputC5=function(){return register[registerAddress]},this.outputC5=function(a){registerWrite(registerAddress,a)},this.outputC6=function(a){registerAddress=256|a},this.audioClockPulse=function(){0==(3&++clock)&&clockTimers()},this.setBusyCycles=function(a){},this.nextSample=function(){return 0};var cpu,busyUntilBUSCycle,audioConnected=!1,status=0,registerAddress=0,register=new Array(56),timer1Counter=0,timer2Counter=0,timer1Active=!1,timer2Active=!1,timer1Masked=!1,timer2Masked=!1,IDLE=255,DAMP=0,ATTACK=1,DECAY=2,SUSTAIN=3,RELEASE=4,clock,noiseRegister,noiseOutput,amLevel,amLevelInc,vibPhase,rhythmMode,sustain=new Array(9),instr=new Array(9),keyOn=new Array(18),am=new Array(18),vib=new Array(18),envType=new Array(18),ksr=new Array(18),multi=new Array(18),ksl=new Array(18),halfWave=new Array(18),ar=new Array(18),dr=new Array(18),sl=new Array(18),rr=new Array(18),fNum=new Array(18),block=new Array(18),volume=new Array(18),modTL=new Array(18),fbShift=new Array(9),volModAtt=new Array(18),amAtt=new Array(18),envAtt=new Array(18),kslAtt=new Array(18),totalAtt=new Array(18),envStep=new Array(18),envStepLevelDur=new Array(18),envStepLevelIncClock=new Array(18),envStepLevelInc=new Array(18),envStepNext=new Array(18),envStepNextAtLevel=new Array(18),envLevel=new Array(18),ksrOffset=new Array(18),fbLastMod1=new Array(9),fbLastMod2=new Array(9),phaseInc=new Array(18),phaseCounter=new Array(18),sineTable,halfSineTable,expTable,instrumentsParameters,multiFactors,vibValues,kslValues,rateAttackDurTable,rateDecayDurTable,VOLUME=1.55/9/256*.65;this.saveState=function(){return{ac:audioConnected,s:status,ra:registerAddress,r:wmsx.Util.storeInt8BitArrayToStringBase64(register),c:clock,nr:noiseRegister,no:noiseOutput,al:amLevel,ai:amLevelInc,vp:vibPhase,t1c:timer1Counter,t2c:timer2Counter,t1a:timer1Active,t2a:timer2Active,t1m:timer1Masked,t2m:timer2Masked,amt:wmsx.Util.storeInt16BitArrayToStringBase64(amAtt),evt:wmsx.Util.storeInt16BitArrayToStringBase64(envAtt),kst:wmsx.Util.storeInt16BitArrayToStringBase64(kslAtt),tot:wmsx.Util.storeInt16BitArrayToStringBase64(totalAtt),evs:wmsx.Util.storeInt8BitArrayToStringBase64(envStep),evd:wmsx.Util.storeInt32BitArrayToStringBase64(envStepLevelDur),evc:envStepLevelIncClock,evi:wmsx.Util.storeInt8BitArrayToStringBase64(envStepLevelInc),evn:wmsx.Util.storeInt8BitArrayToStringBase64(envStepNext),evl:wmsx.Util.storeInt8BitArrayToStringBase64(envStepNextAtLevel),eve:wmsx.Util.storeInt8BitArrayToStringBase64(envLevel),kso:wmsx.Util.storeInt8BitArrayToStringBase64(ksrOffset),fb1:wmsx.Util.storeInt16BitArrayToStringBase64(fbLastMod1),fb2:wmsx.Util.storeInt16BitArrayToStringBase64(fbLastMod2)}},this.loadState=function(a){this.reset(),audioConnected=a.ac,status=a.s,registerAddress=a.ra;for(var b=wmsx.Util.restoreStringBase64ToInt8BitArray(a.r),c=0;c=4194304&&(memoryAddress=0);break;case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:c=a-8,readWaveHeader(c,(1®ister[32+c])<<8|b);break;case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:c=a-32,254&d&&(fNum[c]=b>>1|(7®ister[56+c])<<7,updateFrequency(c));break;case 56:case 57:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 65:case 66:case 67:case 68:case 69:case 70:case 71:case 72:case 73:case 74:case 75:case 76:case 77:case 78:case 79:c=a-56,240&d&&(octave[c]=128&b?(b>>4)-16:b>>4),7&d&&(fNum[c]=(7&b)<<7|register[32+c]>>1), 247&d&&updateFrequency(c),8&d&&(reverb[c]=(8&b)>>3);break;case 80:case 81:case 82:case 83:case 84:case 85:case 86:case 87:case 88:case 89:case 90:case 91:case 92:case 93:case 94:case 95:case 96:case 97:case 98:case 99:case 100:case 101:case 102:case 103:c=a-80,254&d&&(volumeAtt[c]=254&b,updateSettingsAttenuation(c));break;case 104:case 105:case 106:case 107:case 108:case 109:case 110:case 111:case 112:case 113:case 114:case 115:case 116:case 117:case 118:case 119:case 120:case 121:case 122:case 123:case 124:case 125:case 126:case 127:c=a-104,192&d&&setKeyOnAndDamp(c,128&b,64&b),32&d&&setLFOReset(c,32&b),15&d&&(panpotAttL[c]=panpotValues[0][15&b],panpotAttR[c]=panpotValues[1][15&b],updateSettingsAttenuation(c));break;case 128:case 129:case 130:case 131:case 132:case 133:case 134:case 135:case 136:case 137:case 138:case 139:case 140:case 141:case 142:case 143:case 144:case 145:case 146:case 147:case 148:case 149:case 150:case 151:c=a-128,56&d&&(lfoStepDur[c]=lfoStepClocks[(56&b)>>3]),7&d&&(vibDepth[c]=7&b,updateVIBOffset(c,lfoStep[c]));break;case 152:case 153:case 154:case 155:case 156:case 157:case 158:case 159:case 160:case 161:case 162:case 163:case 164:case 165:case 166:case 167:case 168:case 169:case 170:case 171:case 172:case 173:case 174:case 175:c=a-152,240&d&&(ar[c]=b>=240?63:(240&b)>>2),15&d&&(d1r[c]=15==(15&b)?63:(15&b)<<2);break;case 176:case 177:case 178:case 179:case 180:case 181:case 182:case 183:case 184:case 185:case 186:case 187:case 188:case 189:case 190:case 191:case 192:case 193:case 194:case 195:case 196:case 197:case 198:case 199:c=a-176,240&d&&(dl[c]=(b>=240?31:b>>4)<<4),15&d&&(d2r[c]=15==(15&b)?63:(15&b)<<2);break;case 200:case 201:case 202:case 203:case 204:case 205:case 206:case 207:case 208:case 209:case 210:case 211:case 212:case 213:case 214:case 215:case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:c=a-200,240&d&&(rc[c]=b>>4,updateRateCorrOffset(c)),15&d&&(rr[c]=15==(15&b)?63:(15&b)<<2);break;case 224:case 225:case 226:case 227:case 228:case 229:case 230:case 231:case 232:case 233:case 234:case 235:case 236:case 237:case 238:case 239:case 240:case 241:case 242:case 243:case 244:case 245:case 246:case 247:c=a-224,7&d&&(amDepth[c]=7&b,updateAMAttenuation(c,lfoStep[c]));break;case 249:if(63&d)for(mixerAttL=7==(7&b)?512:(7&b)<<4,mixerAttR=56==(56&b)?512:(56&b)<<1,c=23;c>=0;--c)updateSettingsAttenuation(c)}}function registerRead(a){var b;switch(a){case 6:b=opl4.memoryRead(memoryAddress),++memoryAddress>=4194304&&(memoryAddress=0);break;default:b=register[a]}return b}function readWaveHeader(a,b){var c=register[2]>>2&7,d=b<384||0===c?12*b:(c<<19)+12*(b-384),e=opl4.memoryRead(d++);dataBits[a]=e>>6,startAddress[a]=(63&e)<<16|opl4.memoryRead(d++)<<8|opl4.memoryRead(d++),loopPosition[a]=opl4.memoryRead(d++)<<8|opl4.memoryRead(d++),endPosition[a]=65535&~(opl4.memoryRead(d++)<<8|opl4.memoryRead(d++)),registerWrite(128+a,opl4.memoryRead(d++)),registerWrite(152+a,opl4.memoryRead(d++)),registerWrite(176+a,opl4.memoryRead(d++)),registerWrite(200+a,opl4.memoryRead(d++)),registerWrite(224+a,opl4.memoryRead(d++)),envStep[a]!==IDLE&&startSample(a)}function clockLFO(a){return clock!==lfoStepChangeClock[a]?-1:(lfoStepChangeClock[a]+=lfoStepDur[a],lfoStep[a]=lfoStep[a]+1&127)}function updateVIBOffset(a,b){var c=vibStepOffsets[vibDepth[a]<<7|b];vibOffset[a]!==c&&(vibOffset[a]=c,updateFrequency(a))}function updateAMAttenuation(a,b){var c=amStepOffsets[amDepth[a]<<7|b];amAtt[a]!==c&&(amAtt[a]=c,updateDynamicLevel(a))}function clockEnvelope(a){if(clock===envStepLevelChangeClock[a]){var b=envStepLevelPattCounter[a]=envStepLevelPattCounter[a]+1&7;if(envStep[a]===ATTACK){var c=rateAttackPatterns[envStepRate[a]<<3|b];if(c>=0){if(envAtt[a]-=1+(envAtt[a]>>c),envAtt[a]<=0)return setEnvStep(a,DECAY1);updateDynamicLevel(a)}}else if((c=rateDecayPatterns[envStepRate[a]<<3|b])>=0){if(envAtt[a]+=c,envAtt[a]>=envStepNextAtLevel[a])return setEnvStep(a,envStepNext[a]);updateDynamicLevel(a)}envStepLevelChangeClock[a]+=envStepLevelDur[a]}}function setKeyOnAndDamp(a,b,c){c?envStep[a]!==IDLE&&envStep[a]!==DAMP&&setEnvStep(a,DAMP):b?(startSample(a),setEnvStep(a,ATTACK)):envStep[a]!==IDLE&&envStep[a]!==REVERB&&envStep[a]!==DAMP&&setEnvStep(a,RELEASE)}function setLFOReset(a,b){b?(lfoStep[a]=0,lfoStepChangeClock[a]=0,0!==vibOffset[a]&&(vibOffset[a]=0,updateFrequency(a)),0!==amAtt[a]&&(amAtt[a]=0,updateDynamicLevel(a))):lfoStepChangeClock[a]=clock+lfoStepDur[a]}function startSample(a){samplePos[a]=0,phaseCounter[a]=0,sampleValue[a]=readSample(a,0),sampleValue2[a]=readSample(a,advancedSamplePos(a,0,1))}function advanceSample(a,b){var c=advancedSamplePos(a,samplePos[a],b);samplePos[a]=c,sampleValue[a]=readSample(a,c),sampleValue2[a]=readSample(a,advancedSamplePos(a,c,1))}function advancedSamplePos(a,b,c){var d=b+c;return d>endPosition[a]?loopPosition[a]+(d-endPosition[a])-1:d}function readSample(a,b){var c,d,e=startAddress[a],f=dataBits[a];return 1===f?(c=e+3*(b>>1),d=1&b?opl4.memoryRead(c+2)<<4|15&opl4.memoryRead(c+1):opl4.memoryRead(c)<<4|opl4.memoryRead(c+1)>>4,d=d<<4|(2047&d)>>7):2===f?(c=e+(b<<1),d=opl4.memoryRead(c)<<8|opl4.memoryRead(c+1)):0===f?(c=e+b,d=opl4.memoryRead(c),d=d<<8|(127&d)<<1):d=0,32768&d?d-65536:d}function setEnvStep(a,b){var c,d;switch(b){case ATTACK:d=0===ar[a]?0:ar[a]+rcOffset[a];break;case DECAY1:if(envAtt[a]=0,0===(c=dl[a]))return setEnvStep(a,DECAY2);d=0===d1r[a]?0:d1r[a]+rcOffset[a],reverb[a]&&c>=REVERB_ENV_LEVEL?(envStepNextAtLevel[a]=REVERB_ENV_LEVEL,envStepNext[a]=REVERB):(envStepNextAtLevel[a]=c,envStepNext[a]=DECAY2);break;case DECAY2:d=0===d2r[a]?0:d2r[a]+rcOffset[a],reverb[a]&&envAtt[a]=52?1:1<<13-(d>>2),envStepLevelChangeClock[a]=clock+envStepLevelDur[a],envStepLevelPattCounter[a]=0,updateDynamicLevel(a)}function updateFrequency(a){phaseInc[a]=(1024+fNum[a]<<8)+256*vibOffset[a]>>8-octave[a]+1,updateRateCorrOffset(a)}function updateRateCorrOffset(a){if(15===rc[a])return rcOffset[a]=0;var b=(rc[a]+octave[a]<<1)+(fNum[a]>>9);rcOffset[a]=b>=0?b:0}function updateSettingsAttenuation(a){settingsAttL[a]=volumeAtt[a]+panpotAttL[a]+mixerAttL,settingsAttR[a]=volumeAtt[a]+panpotAttR[a]+mixerAttR,updateDynamicLevel(a)}function updateDynamicLevel(a){var b=amAtt[a]+envAtt[a];dynamicLevelL[a]=volumeTable[b+settingsAttL[a]],dynamicLevelR[a]=volumeTable[b+settingsAttR[a]]}var self=this;this.connect=function(a){a.bus.connectOutputDevice(126,this.output7E),a.bus.connectInputDevice(127,this.input7F),a.bus.connectOutputDevice(127,this.output7F)},this.disconnect=function(a){a.bus.disconnectOutputDevice(126,this.output7E),a.bus.disconnectInputDevice(127,this.input7F),a.bus.disconnectOutputDevice(127,this.output7F)},this.reset=function(){clock=0,memoryAddress=0,registerAddress=0,wmsx.Util.arrayFill(register,0),register[2]=34,register[248]=27,register[0]=register[1]=register[7]=register[250]=register[251]=register[252]=register[253]=register[254]=register[255]=255,wmsx.Util.arrayFill(dataBits,0),wmsx.Util.arrayFill(startAddress,0),wmsx.Util.arrayFill(loopPosition,0),wmsx.Util.arrayFill(endPosition,0),wmsx.Util.arrayFill(phaseInc,512),wmsx.Util.arrayFill(fNum,0),wmsx.Util.arrayFill(octave,0),wmsx.Util.arrayFill(reverb,0),wmsx.Util.arrayFill(ar,0),wmsx.Util.arrayFill(d1r,0), wmsx.Util.arrayFill(dl,0),wmsx.Util.arrayFill(d2r,0),wmsx.Util.arrayFill(rr,0),wmsx.Util.arrayFill(rc,0),wmsx.Util.arrayFill(rcOffset,0),wmsx.Util.arrayFill(lfoStepDur,0),wmsx.Util.arrayFill(vibDepth,0),wmsx.Util.arrayFill(amDepth,0),wmsx.Util.arrayFill(volumeAtt,0),wmsx.Util.arrayFill(panpotAttL,0),wmsx.Util.arrayFill(panpotAttR,0),mixerAttL=0,mixerAttR=0,wmsx.Util.arrayFill(samplePos,0),wmsx.Util.arrayFill(sampleValue,0),wmsx.Util.arrayFill(sampleValue2,0),wmsx.Util.arrayFill(phaseCounter,0),wmsx.Util.arrayFill(envStep,IDLE),wmsx.Util.arrayFill(envStepNext,IDLE),wmsx.Util.arrayFill(envStepNextAtLevel,0),wmsx.Util.arrayFill(envStepRate,0),wmsx.Util.arrayFill(envStepLevelDur,0),wmsx.Util.arrayFill(envStepLevelChangeClock,0),wmsx.Util.arrayFill(envStepLevelPattCounter,0),wmsx.Util.arrayFill(envAtt,512),wmsx.Util.arrayFill(lfoStep,0),wmsx.Util.arrayFill(lfoStepChangeClock,0),wmsx.Util.arrayFill(vibOffset,0),wmsx.Util.arrayFill(amAtt,0),wmsx.Util.arrayFill(settingsAttL,0),wmsx.Util.arrayFill(settingsAttR,0),wmsx.Util.arrayFill(dynamicLevelL,0),wmsx.Util.arrayFill(dynamicLevelR,0)},this.output7E=function(a){registerAddress=a},this.input7F=function(){return registerRead(registerAddress)},this.output7F=function(a){registerWrite(registerAddress,a)},this.nextSample=function(){var a,b,c,d,e,f=0,g=0,h=0;for(++clock,e=23;e>=0;--e)a=clockLFO(e),a>=0&&(vibDepth[e]&&updateVIBOffset(e,a),amDepth[e]&&updateAMAttenuation(e,a)),envStep[e]!==IDLE&&(clockEnvelope(e),b=phaseCounter[e],c=phaseCounter[e]=b+phaseInc[e]&2147483647,d=(c>>10)-(b>>10),d>0&&advanceSample(e,d),f=sampleValue[e]*(1024-(1023&c))+sampleValue2[e]*(1023&c)>>10,g+=f*dynamicLevelL[e],h+=f*dynamicLevelR[e]);return sampleResult[0]=g,sampleResult[1]=h,sampleResult};var memoryAddress,registerAddress,register=new Array(255),clock,dataBits=new Array(24),startAddress=new Array(24),loopPosition=new Array(24),endPosition=new Array(24),samplePos=new Array(24),sampleValue=new Array(24),sampleValue2=new Array(24),phaseInc=new Array(24),phaseCounter=new Array(24),fNum=new Array(24),octave=new Array(24),reverb=new Array(24),ar=new Array(24),d1r=new Array(24),dl=new Array(24),d2r=new Array(24),rc=new Array(24),rr=new Array(24),rcOffset=new Array(24),lfoStepDur=new Array(24),vibDepth=new Array(24),amDepth=new Array(24),volumeAtt=new Array(24),panpotAttL=new Array(24),panpotAttR=new Array(24),mixerAttL=0,mixerAttR=0,settingsAttL=new Array(24),settingsAttR=new Array(24),envStep=new Array(24),envStepNext=new Array(24),envStepNextAtLevel=new Array(24),envStepRate=new Array(24),envStepLevelDur=new Array(24),envStepLevelChangeClock=new Array(24),envStepLevelPattCounter=new Array(24),envAtt=new Array(24),lfoStep=new Array(24),lfoStepChangeClock=new Array(24),vibOffset=new Array(24),amAtt=new Array(24),dynamicLevelL=new Array(24),dynamicLevelR=new Array(24),IDLE=255,ATTACK=1,DECAY1=2,DECAY2=3,RELEASE=4,REVERB=5,DAMP=6,REVERB_ENV_LEVEL=96,REVERB_RATE=20,DAMP_RATE=60,regWriteMasks,rateAttackPatterns,rateDecayPatterns,lfoStepClocks,vibStepOffsets,amStepOffsets,panpotValues,volumeTable,sampleResult=[0,0];this.saveState=function(){return{c:clock,ra:registerAddress,ma:memoryAddress,r:wmsx.Util.storeInt8BitArrayToStringBase64(register),db:wmsx.Util.storeInt8BitArrayToStringBase64(dataBits),sa:wmsx.Util.storeInt32BitArrayToStringBase64(startAddress),lp:wmsx.Util.storeInt16BitArrayToStringBase64(loopPosition),ep:wmsx.Util.storeInt16BitArrayToStringBase64(endPosition),sp:wmsx.Util.storeInt16BitArrayToStringBase64(samplePos),sv:wmsx.Util.storeInt16BitArrayToStringBase64(sampleValue),pc:wmsx.Util.storeInt32BitArrayToStringBase64(phaseCounter),evs:wmsx.Util.storeInt8BitArrayToStringBase64(envStep),evr:wmsx.Util.storeInt8BitArrayToStringBase64(envStepRate),evd:wmsx.Util.storeInt32BitArrayToStringBase64(envStepLevelDur),evc:envStepLevelChangeClock,evn:wmsx.Util.storeInt8BitArrayToStringBase64(envStepNext),evl:wmsx.Util.storeInt16BitArrayToStringBase64(envStepNextAtLevel),epc:wmsx.Util.storeInt8BitArrayToStringBase64(envStepLevelPattCounter),eva:wmsx.Util.storeInt16BitArrayToStringBase64(envAtt),lfs:wmsx.Util.storeInt8BitArrayToStringBase64(lfoStep),lfc:lfoStepChangeClock,vio:wmsx.Util.storeInt8BitArrayToStringBase64(vibOffset),ama:wmsx.Util.storeInt8BitArrayToStringBase64(amAtt),saL:wmsx.Util.storeInt16BitArrayToStringBase64(settingsAttL),saR:wmsx.Util.storeInt16BitArrayToStringBase64(settingsAttR),dlvL:dynamicLevelL,dlvR:dynamicLevelR}},this.loadState=function(a){this.reset(),registerAddress=a.ra;for(var b=wmsx.Util.restoreStringBase64ToInt8BitArray(a.r),c=2;c<6;c++)registerWrite(c,b[c]);for(c=8;c<32;c++)register[c]=b[c];for(c=32;c<250;c++)registerWrite(c,b[c]);memoryAddress=a.ma,clock=a.c,dataBits=wmsx.Util.restoreStringBase64ToInt8BitArray(a.db,dataBits),startAddress=wmsx.Util.restoreStringBase64ToInt32BitArray(a.sa,startAddress),loopPosition=wmsx.Util.restoreStringBase64ToInt16BitArray(a.lp,loopPosition),endPosition=wmsx.Util.restoreStringBase64ToInt16BitArray(a.ep,endPosition),phaseCounter=wmsx.Util.restoreStringBase64ToInt32BitArray(a.pc,phaseCounter),samplePos=wmsx.Util.restoreStringBase64ToInt16BitArray(a.sp,samplePos),sampleValue=wmsx.Util.restoreStringBase64ToSignedInt16BitArray(a.sv,sampleValue),envStep=wmsx.Util.restoreStringBase64ToInt8BitArray(a.evs,envStep),envStepRate=wmsx.Util.restoreStringBase64ToInt8BitArray(a.evr,envStepRate),envStepLevelDur=wmsx.Util.restoreStringBase64ToInt32BitArray(a.evd,envStepLevelDur),envStepLevelChangeClock=a.evc,envStepNext=wmsx.Util.restoreStringBase64ToInt8BitArray(a.evn,envStepNext),envStepNextAtLevel=wmsx.Util.restoreStringBase64ToInt16BitArray(a.evl,envStepNextAtLevel),envStepLevelPattCounter=wmsx.Util.restoreStringBase64ToInt16BitArray(a.epc,envStepLevelPattCounter),envAtt=wmsx.Util.restoreStringBase64ToInt16BitArray(a.eva,envAtt),lfoStep=wmsx.Util.restoreStringBase64ToInt8BitArray(a.lfs,lfoStep),lfoStepChangeClock=a.lfc,vibOffset=wmsx.Util.restoreStringBase64ToSignedInt8BitArray(a.vio,vibOffset),amAtt=wmsx.Util.restoreStringBase64ToInt8BitArray(a.ama,amAtt),settingsAttL=wmsx.Util.restoreStringBase64ToInt16BitArray(a.saL,settingsAttL),settingsAttR=wmsx.Util.restoreStringBase64ToInt16BitArray(a.saR,settingsAttR),dynamicLevelL=a.dlvL,dynamicLevelR=a.dlvR},init(),this.eval=function(str){return eval(str)}},wmsx.RTC=function(a){"use strict";function b(a){j!==a&&(a?(d(),j=!0):(j=!1,c()))}function c(){i||(i=new Date(Math.floor(h))),l[0]=i.getUTCSeconds()%10,l[1]=i.getUTCSeconds()/10|0,l[2]=i.getUTCMinutes()%10,l[3]=i.getUTCMinutes()/10|0,m[10]?(l[4]=i.getUTCHours()%10,l[5]=i.getUTCHours()/10|0):(l[4]=i.getUTCHours()%12%10,l[5]=i.getUTCHours()%12/10|0,i.getUTCHours()>=12&&(l[5]|=2)),l[6]=i.getUTCDay()+1,l[7]=i.getUTCDate()%10,l[8]=i.getUTCDate()/10|0,l[9]=(i.getUTCMonth()+1)%10,l[10]=(i.getUTCMonth()+1)/10|0,l[11]=(i.getUTCFullYear()-1980)%10,l[12]=(i.getUTCFullYear()-1980)/10|0}function d(){i||(i=new Date),i.setUTCSeconds(l[0]+10*l[1]),i.setUTCMinutes(l[2]+10*l[3]),1&m[10]?i.setUTCHours(l[4]+10*l[5]):i.setUTCHours(l[4]+(2&l[5]?12:0)+(1&l[5]?10:0)),i.setUTCDate(l[7]+10*l[8]),i.setUTCMonth(l[9]+10*l[10]-1),i.setUTCFullYear(l[11]+10*l[12]+1980),h=i.getTime()}function e(a){if(a&=1,(1&m[10])!==a){var b;a?(b=l[4]+(2&l[5]?12:0)+(1&l[5]?10:0),l[5]=b/10|0,l[4]=b%10):(b=l[4]+10*l[5],l[5]=(b>=12?2:0)|(b%12>=10?1:0),l[4]=b%12%10)}}this.setMachineType=function(a){f=WMSX.RTC_ACTIVE>=0?!!WMSX.RTC_ACTIVE:a>=wmsx.Machine.MACHINE_TYPE.MSX2,f&&wmsx.Util.arrayFill(n[0],0),wmsx.Util.arrayFill(n[1],0)},this.connectBus=function(a){a.connectInputDevice(180,wmsx.DeviceMissing.inputPortIgnored),a.connectOutputDevice(180,this.outputB4),a.connectInputDevice(181,this.inputB5),a.connectOutputDevice(181,this.outputB5)},this.powerOn=function(){this.reset()},this.powerOff=function(){},this.reset=function(){g=0,b(!0)},this.videoClockPulse=function(){h+=k,i&&(i=void 0)},this.setFps=function(a){k=1e3/a}, this.syncTimeWithSource=function(){var b=a.getRealTime();b<=h||(h=b,j||c())},this.outputB4=function(a){f&&(o=15&a)},this.outputB5=function(a){if(f)if(a&=15,o<13)switch(g){case 0:l[o]=a&p[o];break;case 1:10===o&&e(a),m[o]=a&q[o];break;case 2:case 3:n[1&g][o]=a}else switch(o){case 13:g=3&a,b(0!=(8&a))}},this.inputB5=function(){if(!f)return 255;var a;if(o<13)switch(g){case 0:j&&c(),a=l[o];break;case 1:a=m[o];break;case 2:case 3:a=n[1&g][o]}else switch(o){case 13:a=(j?8:0)|g;break;case 14:case 15:a=15}return a};var f,g=0,h=0,i=void 0,j=!0,k=1e3/60,l=wmsx.Util.arrayFill(new Array(13),0),m=wmsx.Util.arrayFill(new Array(13),0),n=[new Array(13),new Array(13)],o=0,p=[15,7,15,7,15,3,7,15,3,15,1,15,15],q=[0,0,15,7,15,3,7,15,3,0,1,3,0];this.saveState=function(){return{a:f,m:g,i:h,c:j,rc:wmsx.Util.storeInt8BitArrayToStringBase64(l),rm:wmsx.Util.storeInt8BitArrayToStringBase64(m),r0:wmsx.Util.storeInt8BitArrayToStringBase64(n[0]),r1:wmsx.Util.storeInt8BitArrayToStringBase64(n[1]),ra:o}},this.loadState=function(a){f=void 0!==a.a?a.a:a.m2,g=a.m,j=a.c,h=a.i?a.i:a.co+a.t,i=void 0,l=wmsx.Util.restoreStringBase64ToInt8BitArray(a.rc,l),m=wmsx.Util.restoreStringBase64ToInt8BitArray(a.rm,m),n[0]=wmsx.Util.restoreStringBase64ToInt8BitArray(a.r0,n[0]),n[1]=wmsx.Util.restoreStringBase64ToInt8BitArray(a.r1,n[1]),o=a.ra}},wmsx.SystemFlags=function(){"use strict";this.setMachineType=function(c){a=c>=wmsx.Machine.MACHINE_TYPE.MSX2P,b=c>=wmsx.Machine.MACHINE_TYPE.MSXTR},this.connectBus=function(a){a.connectInputDevice(243,this.inputF3),a.connectOutputDevice(243,this.outputF3),a.connectInputDevice(244,this.inputF4),a.connectOutputDevice(244,this.outputF4),a.connectInputDevice(245,wmsx.DeviceMissing.outputPortIgnored),a.connectOutputDevice(245,wmsx.DeviceMissing.outputPortIgnored),a.connectInputDevice(246,wmsx.DeviceMissing.inputPortIgnored),a.connectOutputDevice(246,wmsx.DeviceMissing.outputPortIgnored),a.connectInputDevice(247,wmsx.DeviceMissing.inputPortIgnored),a.connectOutputDevice(247,wmsx.DeviceMissing.outputPortIgnored),a.connectInputDevice(248,wmsx.DeviceMissing.inputPortIgnored),a.connectOutputDevice(248,wmsx.DeviceMissing.outputPortIgnored)},this.powerOn=function(){this.reset()},this.powerOff=function(){},this.reset=function(){c=b?0:255,d=0},this.inputF3=function(){return a?d:255},this.outputF3=function(b){a&&(d=b)},this.inputF4=function(){return a?c:255},this.outputF4=function(b){a&&(c=b)};var a=!1,b=!1,c=0,d=0;this.saveState=function(){return{a:a,tr:b,bf:c,vf:d}},this.loadState=function(e){a=void 0!==e.a?e.a:e.m2p,b=void 0!==e.tr&&e.tr,c=e.bf,d=e.vf}},wmsx.TurboRDevices=function(a,b){"use strict";function c(){a.setZ80BUSRQ(o)}function d(a){i.setDRAMMode(l&&a),j.setDRAMMode(l&&a),k.setDRAMMode(l&&a),l&&l.setDRAMMode(a)}function e(){return(a.getBUSCycles()-u)/14&65535}function f(){b.ledStateChanged(2,1&p||o&&32&t?1:0),b.ledStateChanged(4,128&p?2+q:64&t?0:1)}function g(a){return{F:a|=1}}function h(a){return{F:a|=1}}this.setMachineType=function(a){m=a>=wmsx.Machine.MACHINE_TYPE.MSXTR},this.connectBus=function(a){i=a,i.connectInputDevice(167,this.inputA7),i.connectOutputDevice(167,this.outputA7),i.connectInputDevice(228,this.inputE4),i.connectOutputDevice(228,this.outputE4),i.connectInputDevice(229,this.inputE5),i.connectOutputDevice(229,this.outputE5),i.connectInputDevice(230,this.inputE6),i.connectInputDevice(231,this.inputE7),i.connectOutputDevice(230,this.outputE6),i.connectOutputDevice(231,wmsx.DeviceMissing.outputPortIgnored())},this.connectBIOS=function(a){j=a,this.patchPCMBIOS(j.bytes),l&&j.connectRAM(l,65536)},this.disconnectBIOS=function(a){j===a&&(j=void 0)},this.connectBIOSExt=function(a){k=a,l&&k.connectRAM(l,32768)},this.disconnectBIOSExt=function(a){k===a&&(k=void 0)},this.connectRAM=function(a){a.format===wmsx.SlotFormats.RAMMapper&&(l=a,j&&j.connectRAM(l,65536),k&&k.connectRAM(l,32768))},this.disconnectRAM=function(a){l===a&&(j&&j.disconnectRAM(l),k&&k.disconnectRAM(l),l=void 0)},this.powerOn=function(){this.reset()},this.powerOff=function(){this.reset()},this.reset=function(){p=0,q=0,r=0,t=96,this.outputE6(0),f()},this.outputA7=function(a){a&=129,m&&p!==a&&(p=a,f())},this.inputA7=function(){return m?n&&0==(32&t)?1:0:255},this.outputE4=function(a){m&&(r=a)},this.inputE4=function(){return m?r:255},this.outputE5=function(b){if(6===r){var c=96&b,e=b^t;if(!e)return;t=c,a.setR800Mode(0==(32&t)),d(0==(64&t)),32&t&&128&p||(q=64&t?0:1),(128&p||64&e)&&f()}},this.inputE5=function(){return 5===r?s:6===r?t:255},this.outputE6=function(b){u=a.getBUSCycles()},this.inputE6=function(){return m?255&e():255},this.inputE7=function(){return m?e()>>8:255},this.isR800LedOn=function(){return 0!=(128&p)},this.isCPUPaused=function(){return n},this.setCPUPause=function(a,b){n=a,b&&this.vSyncPulse()},this.vSyncPulse=function(){n!==o&&(o=n,c(),f())},this.patchPCMBIOS=function(a){m&&(a[390]=237,a[391]=236,a[392]=201,a[393]=237,a[394]=237,a[395]=201)},this.cpuExtensionBegin=function(a){switch(a.extNum){case 236:return g(a.F);case 237:return h(a.F)}},this.cpuExtensionFinish=function(a){};var i,j,k,l,m=!1,n=!1,o=!1,p=0,q=0,r=0,s=0,t=96,u=0;this.saveState=function(){return{a:m,cp:n,zp:o,ld:p,rl:q,rs:r,r5:s,r6:t,cb:u}},this.loadState=function(a){a?(m=a.a,n=a.cp,o=a.zp,p=a.ld,q=a.rl||0,r=a.rs,s=a.r5,t=a.r6,u=a.cb):(m=!1,this.reset(),n=!1,o=!1),c(),f()}},wmsx.ImageCassetteDriver=function(){"use strict";function a(a){return l.motor(!0),l.readHeader()?h(a,o):i(a)}function b(a){var b=l.readByte();if(null===b)return i(a);var c=h(a,p);return c.A=b,c}function c(){l.motor(!1)}function d(a,b){return l.motor(!0),l.writeHeader(a)?h(b,a?m:n):i(b)}function e(a,b){return l.writeByte(a)?h(b,p):i(b)}function f(){l.finishWriting(),l.motor(!1)}function g(a){l.motor(255===a?null:a>0)}function h(a,b){return{F:254&a,extraIterations:b}}function i(a){return{F:a|=1}}var j=this;this.connect=function(a,b){this.patchTapeBIOS(a.bytes,b),b.getCassetteSocket().connectDriver(this),l=b.getCassetteSocket().getDeck(),k=a.getKeyboardExtension()},this.disconnect=function(a,b){b.getCassetteSocket().connectDriver(null)},this.powerOff=function(){l&&l.motor(!1)},this.typeCurrentAutoRunCommand=function(){var a=j.currentAutoRunCommand();a&&k.typeString(a)},this.currentAutoRunCommand=function(){var a=l.peekFileInfoAtCurrentPosition();if(!a)return null;switch(a.type){case"Binary":return'\r\r\rbload "cas:'+a.name+'", r\r';case"Basic":return'\r\r\rcload "'+a.name+'"\rrun\r';case"ASCII":return'\r\r\rrun "cas:'+a.name+'"\r'}return null},this.cpuExtensionBegin=function(h){switch(h.extNum){case 224:return a(h.F);case 226:return b(h.F);case 228:return c();case 229:return d(h.A,h.F);case 230:return e(h.A,h.F);case 231:return f();case 232:return g(h.A)}},this.cpuExtensionFinish=function(a){},this.patchTapeBIOS=function(a,b){b.getMachineTypeSocket().getMachineType()>=wmsx.Machine.MACHINE_TYPE.MSXTR||(a[225]=237,a[226]=224,a[227]=201,a[228]=237,a[229]=226,a[230]=201,a[231]=237,a[232]=228,a[233]=201,a[234]=237,a[235]=229,a[236]=201,a[237]=237,a[238]=230,a[239]=201,a[240]=237,a[241]=231,a[242]=201,a[243]=237,a[244]=232,a[245]=201)};var k,l,m=3e5,n=m/3,o=.4*n,p=10},wmsx.TurboDriver=function(a){"use strict";function b(){if(h){var b=a.bytes;b[384]=195,b[385]=141,b[386]=1,b[387]=195,b[388]=144,b[389]=1,b[397]=237,b[398]=238,b[399]=201,b[400]=237,b[401]=239,b[402]=201}i?g.bus.connectSwitchedDevice(8,e):g.bus.disconnectSwitchedDevice(8,e)}function c(a){j=131&a;var b=(3&j)>0;k!==b&&(k=b,0===g.getZ80ClockMode()?(e.turboModesUpdate(),g.showZ80ClockModeMessage()):g.showOSD("Could not set Z80 Turbo by software: mode is FORCED "+g.getZ80ClockModeDesc(),!0,!0))}function d(){return{A:3&j}}var e=this;this.connect=function(a){g=a,f=g.getLedsSocket();var c=g.getMachineTypeSocket().getMachineType();h=c0?b:1;g.cpu.setZ80ClockMulti(e),g.cpu.setR800ClockMulti(c),g.vdp.setVDPTurboMulti(0===d&&a&&k?WMSX.VDP_SOFT_TURBO_MULTI:d>0?d:1);var j=g.cpu.getR800ClockMulti();f.ledStateChanged(3,1!==e?1:0),f.ledInfoChanged(3,1!==e?e+"x":""),f.ledInfoChanged(4,1!==j?j+"x":"")},this.cpuExtensionBegin=function(a){if(!(g.machineType<=1))switch(a.extNum){case 238:return c(a.A);case 239:return d()}},this.cpuExtensionFinish=function(a){},this.switchedPortInput=function(a){return 65!==a?255:k?0:1},this.switchedPortOutput=function(a,b){65===b&&c(0==(1&a)?129:0)},this.saveState=function(){return{tt:h,pt:i,st:k,cv:j}},this.loadState=function(a){k=!(!a||!a.st)&&a.st,j=a&&a.cv?a.cv:0;var c=g&&g.getMachineTypeSocket().getMachineType(),d=c===l.MSX2P;h=a&&void 0!==a.tt?a.tt:d,i=a&&void 0!==a.pt?a.pt:d,g&&b()};var f,g,h=!1,i=!1,j=0,k=!1,l=wmsx.Machine.MACHINE_TYPE},wmsx.BIOSKeyboardExtension=function(){"use strict";this.connect=function(b){a=b.bus},this.typeString=function(a){if(void 0!==a&&null!==a){var c=a.toString();c&&(c=c.replace(/\r\n/g,"\r").replace(/\n/g,"\r"),b=(b||"")+c)}},this.cancelTypeString=function(){b=null,c=0},this.keyboardExtensionClockPulse=function(){if(b){var h=a.read(e)|a.read(e+1)<<8;if(!(hg)){var i=a.read(d)|a.read(d+1)<<8;if(!(ig)){var j=h-i-1;if(j<0&&(j+=40),!(j<=0)){for(var k=b.substr(c,j),l=0;lg&&(i=f);a.write(d,255&i),a.write(d+1,i>>8),c+=k.length,c>=b.length&&this.cancelTypeString()}}}}},this.saveState=function(){return{s:b&&btoa(b),p:c}},this.loadState=function(a){b=a.s&&atob(a.s),c=a.p};var a,b,c=0,d=62456,e=62458,f=64496,g=64535},wmsx.ImageDiskDriver=function(a){"use strict";function b(a,b){return{HL:65280&b|(64&a?1:2)}}function c(a,b,c,f,g,h){return 1&a?e(a,b,c,f,g,h):d(a,b,c,f,g,h)}function d(a,b,c,d,e,f){var g=p.motorOn(b);return p.readSectorsToSlot(b,e,c,l(f),f)?{F:-2&a,B:0,extraIterations:g+c*v}:{F:1|a,A:2,B:c,extraIterations:g}}function e(a,b,c,d,e,f){var g=p.motorOn(b);return p.isDiskInserted(b)&&p.writeSectorsFromSlot(b,e,c,l(f),f)?{F:-2&a,B:0,extraIterations:g+c*v}:{F:1|a,A:2,B:c,extraIterations:g}}function f(b,c,d,e,f){var h=p.diskHasChanged(c);if(!1===h)return{F:-2&b,B:1};var i=p.motorOn(c),j=p.readByte(c,t);return null===j?{F:1|b,A:2,B:0,extraIterations:i}:(a||g(b,c,j,e,f,!0),{F:-2&b,B:!0===h?255:0,extraIterations:i})}function g(a,b,c,d,e,f){var g=c<248?d:c;return g<248?{F:1|a}:(k(p.MEDIA_TYPE_DPB[g],e+1),{F:-2&a})}function h(a){return{HL:s[a]||0}}function i(a,b,c){var d=c>>>8,e=b>=1&&b<=2?b-1:0;if(e<0||e>1||d<0||d>1)return{F:1|a,A:12};var f=p.FORMAT_OPTIONS_MEDIA_TYPES[e];return p.insertNewDisk(d,f,!1,!0),p.motorOn(d),p.formatCurrentDisk(d,f),{F:-2&a,extraIterations:w}}function j(){p.allMotorsOffNow()}function k(a,b){for(var c=l(b),d=0;d=16384&&a<=32767){var c=q.read(62274);b=q.getSlot(3&c),0!=(128&c)&&b.isExpanded()&&(b=b.getSubSlot(c>>2&3))}else b=q.getSlotForAddress(a),b.isExpanded()&&(b=b.getSubSlotForAddress(a));return b}function m(a,b,c){delete r[b];var d=q.read(c+26),e=3&d,f=e<=1;return f&&(p.motorFlash(e),!p.isDiskInserted(e))?{F:1|a,A:26}:(q.write(c+0,f?1:0),q.write(c+1,130),q.write(c+12+0,0),q.write(c+12+1,0),q.write(c+12+2,0),q.write(c+12+3,0),q.write(c+28,9),q.write(c+29,0),q.write(c+30,2),r[b]=e,{F:-2&a})}function n(a,b,c,d,e,f){var g=r[b];return g>=0&&p.motorFlash(g),void 0!==g&&p.isDiskInserted(g)?p.readSectorsToSlot(g,(f<<16)+e,c,q,d)?{F:-2&a}:{F:1|a,A:6}:{F:1|a,A:26}}function o(a,b,c,d,e,f){var g=r[b];return g>=0&&p.motorFlash(g),void 0!==g&&p.isDiskInserted(g)?p.writeSectorsFromSlot(g,(f<<16)+e,c,q,d)?{F:-2&a}:{F:1|a,A:6}:{F:1|a,A:26}}this.connect=function(a,b){p=b.getDiskDriveSocket().getDrive(),q=b.bus,q.setCpuExtensionHandler(244,this),q.setCpuExtensionHandler(245,this),q.setCpuExtensionHandler(246,this)},this.disconnect=function(a,b){p.allMotorsOff(),q.setCpuExtensionHandler(244,void 0),q.setCpuExtensionHandler(245,void 0),q.setCpuExtensionHandler(246,void 0)},this.powerOff=function(){p.allMotorsOff()},this.cpuExtensionBegin=function(a){switch(a.extNum){case 224:return;case 226:return b(a.F,a.HL);case 228:return c(a.F,a.A,a.B,a.C,a.DE,a.HL);case 229:return f(a.F,a.A,a.B,a.C,a.HL);case 230:return g(a.F,a.A,a.B,a.C,a.HL);case 231:return h(a.extPC);case 232:return i(a.F,a.A,a.DE);case 234:return j();case 244:return n(a.F,a.C,a.B,a.HL,a.IX,a.IY);case 245:return o(a.F,a.C,a.B,a.HL,a.IX,a.IY);case 246:return m(a.F,a.C,a.HL)}},this.cpuExtensionFinish=function(a){p.allMotorsOff()},this.patchDiskBIOS=function(a,b,c,d,e,f){var g=0,h=0;if(a[b+d+0]=237,a[b+d+1]=224,a[b+d+2]=0,a[b+e+0]=237,a[b+e+1]=226,a[b+e+2]=0,g=b+(a[b+c+16+0+1]|a[b+c+16+0+2]<<8),a[g+0]=237,a[g+1]=228,a[g+2]=201,g=b+(a[b+c+16+3+1]|a[b+c+16+3+2]<<8),a[g+0]=237,a[g+1]=229,a[g+2]=201,g=b+(a[b+c+16+6+1]|a[b+c+16+6+2]<<8),a[g+0]=237,a[g+1]=230,a[g+2]=201,g=b+(a[b+c+16+9+1]|a[b+c+16+9+2]<<8),h=g-b,a[g+0]=237,a[g+1]=231,a[g+2]=201,g=b+(a[b+c+16+12+1]|a[b+c+16+12+2]<<8),a[g+0]=237,a[g+1]=232,a[g+2]=201,g=b+(a[b+c+16+15+1]|a[b+c+16+15+2]<<8),a[g+0]=237,a[g+1]=234,a[g+2]=201,f>=0){s[h]=f;for(var i=0;i>8&255,d>>16&255,d>>24&255,1,0,0,0,0],f=0;f<12;++f)m.write(c+f,e[f]);return{A:0}}function i(a,b,c){delete n[b];var d=m.read(c+26),e=d>>4,f=15&d,g=0===e,h=0;if(g){if(l.motorFlash(2),!l.isDiskInserted(2))return{F:1|a,A:26};var i=l.readByte(2,510)<<8|l.readByte(2,511);if(null===i)return{F:1|a,A:26};var j=21930===i;if(f>0){if(!j)return{F:1|a,A:4};var k=446+16*(f-1),o=l.readByte(2,k+4);if(h=l.readDWord(2,k+8),null===o||null===h)return{F:1|a,A:26};if(!h||!o)return{F:1|a,A:4}}else if(j)return{F:1|a,A:4}}return m.write(c+0,g?1:0),m.write(c+1,145),m.write(c+12+0,255&h),m.write(c+12+1,h>>8&255),m.write(c+12+2,h>>16&255),m.write(c+12+3,h>>24&255),m.write(c+31,0),n[b]=h,{F:-2&a}}function j(a,b,c,d,e,f){var g=n[b];return g>=0&&l.motorFlash(2), void 0!==g&&l.isDiskInserted(2)?l.readSectorsToSlot(2,g+(f<<16)+e,c,m,d)?{F:-2&a}:{F:1|a,A:9}:{F:1|a,A:26}}function k(a,b,c,d,e,f){var g=n[b];return g>=0&&l.motorFlash(2),void 0!==g&&l.isDiskInserted(2)?l.writeSectorsFromSlot(2,g+(f<<16)+e,c,m,d)?{F:-2&a}:{F:1|a,A:9}:{F:1|a,A:26}}this.connect=function(a,b){l=b.getDiskDriveSocket().getDrive(),m=b.bus,m.setCpuExtensionHandler(240,this),m.setCpuExtensionHandler(241,this),m.setCpuExtensionHandler(242,this)},this.disconnect=function(a,b){b.bus.setCpuExtensionHandler(240,void 0),b.bus.setCpuExtensionHandler(241,void 0),b.bus.setCpuExtensionHandler(242,void 0)},this.powerOff=function(){},this.cpuExtensionBegin=function(d){switch(d.extNum){case 224:return a();case 226:return b(d.A,d.B,d.HL);case 228:return c(d.F,d.A,d.B,d.C,d.DE,d.HL);case 229:return f(d.A,d.B,d.HL);case 230:return g(d.A,d.B);case 231:return h(d.A,d.B,d.HL);case 240:return j(d.F,d.C,d.B,d.HL,d.IX,d.IY);case 241:return k(d.F,d.C,d.B,d.HL,d.IX,d.IY);case 242:return i(d.F,d.C,d.HL)}},this.cpuExtensionFinish=function(a){},this.patchNextorKernel=function(a){a[114958]=1;for(var b="WebMSX Nextor Device Driver ",c=0;c<32;++c)a[114960+c]=b.charCodeAt(c);for(a[114992]=201,a[114993]=201,a[114994]=201,a[114995]=237,a[114996]=224,a[114997]=201,a[114998]=237,a[114999]=226,a[115e3]=201,a[115001]=55,a[115002]=201,a[115003]=201,a[115004]=55,a[115005]=201,a[115006]=201,a[115007]=201,a[115008]=201,a[115009]=201,c=115010;c<115026;++c)a[c]=201;a[115040]=237,a[115041]=228,a[115042]=201,a[115043]=237,a[115044]=229,a[115045]=201,a[115046]=237,a[115047]=230,a[115048]=201,a[115049]=237,a[115050]=231,a[115051]=201},this.saveState=function(){return{so:n}},this.loadState=function(a){n=void 0!==(a&&a.so)?a.so:{}};var l,m,n={},o=252,p=181},wmsx.ROM=function(a,b,c,d,e){"use strict";this.source=wmsx.Util.leafFilename(a),this.content=b,this.info=c||wmsx.SlotCreator.produceInfo(this,d,e),this.saveState=function(){return{s:this.source,i:this.info}},this.reloadEmbeddedContent=function(){if(!this.content&&wmsx.EmbeddedFiles.isEmbeddedURL(this.source)){this.source=wmsx.Configurator.adaptROMSourceForOldState(this.source);var a=wmsx.EmbeddedFiles.get(this.source);if(!a)throw new Error("Cannot reload embedded content: "+this.source);this.content=a.content}}},wmsx.ROM.loadState=function(a){var b=wmsx.Configurator.adaptROMSourceForOldState(a.s);return new wmsx.ROM(b,null,a.i)},wmsx.ROMDatabase={uncompress:function(){wmsx.ROMDatabase=JSON.parse(wmsx.Util.uncompressStringBase64ToString(this.data))}, data:"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" },wmsx.SlotCreator=function(){"use strict";function a(a,b){var c,d=[];for(var e in wmsx.SlotFormats)c=wmsx.SlotFormats[e],c.prioritySelected=c.priorityForRom(a,b),c.prioritySelected&&(f(c,a.info),c.prioritySelected>=j||d.push(c));return d.sort(function(a,b){return a.prioritySelected-b.prioritySelected}),d}function b(a){var b={};return a.n&&(b.n=a.n),a.h&&(b.h=a.h),a.f&&(b.f=a.f),a.t&&(b.t=a.t),a.l&&(b.l=a.l),a.e&&(b.e=a.e),b}this.createFromROM=function(a,b){var d=c.getForROM(a);if(d){var e=wmsx.SlotFormats[d];if(e.priorityForRom(a))return wmsx.Util.log("USER Format selected: "+e.desc),e.createFromROM(a)}var f=this.getBestFormatOption(a,b);if(f){return wmsx.EmbeddedFiles.isEmbeddedURL(a.source)||wmsx.Util.log("AUTO Format selected: "+f.desc+", priority: "+f.prioritySelected),f.createFromROM(a)}},this.recreateFromSaveState=function(a,b){var c=wmsx.SlotFormats[a.f];if(!c)throw new Error("Unsupported ROM Format in Savestate: "+a.f);return b&&b.format!==c&&b.formatBack!==c&&(b=null),c.recreateFromSaveState(a,b)},this.changeCartridgeFormat=function(a,b){return b.createFromROM(a.rom)},this.getBestFormatOption=function(b,c){var d=a(b,c);return 0===d.length?void 0:d[0]},this.getUserFormatOptionNames=function(a){for(var b=[],c=0,d=wmsx.SlotFormatsUserOptions.length;cm?void 0:wmsx.Util.sha1Generator.calcSHA1FromByteArray(a.content).toUpperCase();a.content.length>g&&(a.content.length=g);var i=wmsx.ROMDatabase[h],j=wmsx.EmbeddedFiles.isEmbeddedURL(a.source);return i?(i=b(i),j||wmsx.Util.log("ROM: "+i.n+(i.f?", format: "+i.f:"")+" ("+h+")")):(i=d(a.source),j||wmsx.Util.log("ROM: "+(g>0?"Unknown content":"No content")+", "+i.n+(i.f?", format: "+i.f:"")+(h?" ("+h+")":" (no hash computed)"))),e(i,a.source,h,c,f),i},this.setUserROMFormats=function(a){c=a};var c,d=function(a){var b={n:"Unknown"};return a?(b.n=wmsx.Util.leafFilenameNoExtension(a)||"Unknown",b):b},e=function(a,b,c,d,e){if(a.h=c,d){d=d.trim().toUpperCase();for(var f in wmsx.SlotFormats)if(f.toUpperCase()===d){a.f=wmsx.SlotFormats[f].name,a.t=!0;break}}if(!a.t){var h=b.toUpperCase();for(f in wmsx.SlotFormats)if(g(f.toUpperCase(),h)){a.f=wmsx.SlotFormats[f].name,a.t=!0;break}}void 0!==e&&null!==e&&(a.s=0|parseInt(e))},f=function(a,b){b.f&&a.name===b.f&&(a.prioritySelected-=b.t?l:k)},g=function(a,b){return b.match(h+a+i)},h="\\[",i="\\]",j=1e3,k=1e3,l=5e3,m=1024*(WMSX.ROM_MAX_HASH_SIZE_KB||5120);this.FORMAT_PRIORITY_BOOST=k},wmsx.SlotCreator=new wmsx.SlotCreator,wmsx.SlotFormats={Empty:{name:"Empty",desc:"Empty Slot",priority:1001,internal:!0,embeddedURL:"@[Empty].rom",priorityForRom:function(a){return a&&a.content&&0!==a.content.length?null:this.priority},createFromROM:function(a){return wmsx.SlotEmpty.singleton},recreateFromSaveState:function(a,b){return wmsx.SlotEmpty.singleton}},Expanded0:{name:"Expanded0",desc:"Special Expanded Slot 0",priority:1002,internal:!0,priorityForRom:function(a){return null},createFromROM:null,recreateFromSaveState:function(a,b){return wmsx.SlotExpanded0.recreateFromSaveState(a,b)}},Expanded3:{name:"Expanded3",desc:"Special Expanded Slot 3",priority:1003,internal:!0,priorityForRom:function(a){return null},createFromROM:null,recreateFromSaveState:function(a,b){return wmsx.SlotExpanded3.recreateFromSaveState(a,b)}},ExpandedS:{name:"ExpandedS",desc:"Simple Expanded Slot",priority:1004,internal:!0,priorityForRom:function(a){return null},createFromROM:null,recreateFromSaveState:function(a,b){return wmsx.SlotExpanded.recreateFromSaveState(a,b)}},ExpandedM:{name:"ExpandedM",desc:"Special Expanded Slot 4 (Modules: Device-only Slots)",priority:1005,internal:!0,priorityForRom:function(a){return null},createFromROM:null,recreateFromSaveState:function(a,b){return wmsx.SlotExpandedM.recreateFromSaveState(a,b)}},BIOS:{name:"BIOS",desc:"Main BIOS",priority:201,internal:!0,priorityForRom:function(a){return a.content.length>=16384&&a.content.length<=49152&&243===a.content[0]&&(195===a.content[1]||24===a.content[1])?this.priority:null},createFromROM:function(a){return new wmsx.SlotBIOS(a)},recreateFromSaveState:function(a,b){return wmsx.SlotBIOS.recreateFromSaveState(a,b)}},MSX2BIOSExt:{name:"MSX2BIOSExt",desc:"MSX2/2+/tR BIOS Extension",priority:202,internal:!0,priorityForRom:function(a){return a.content.length>=16384&&a.content.length<=49152&&67===a.content[0]&&68===a.content[1]?this.priority:null},createFromROM:function(a){return new wmsx.SlotMSX2BIOSExt(a)},recreateFromSaveState:function(a,b){return wmsx.SlotMSX2BIOSExt.recreateFromSaveState(a,b)}},RAMNormal:{name:"RAMNormal",desc:"Normal RAM (unmapped)",priority:1011,internal:!0,embeddedURL:"@[RAMNormal].rom",priorityForRom:function(a){return 0===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.SlotRAMNormal(a)},recreateFromSaveState:function(a,b){return wmsx.SlotRAMNormal.recreateFromSaveState(a,b)}},RAMMapper:{name:"RAMMapper",desc:"Standard RAM Mapper",priority:1012,internal:!0,embeddedURL:"@[RAMMapper].rom",priorityForRom:function(a){return 0===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.SlotRAMMapper(a)},recreateFromSaveState:function(a,b){return wmsx.SlotRAMMapper.recreateFromSaveState(a,b)}},PlainROM:{name:"PlainROM",desc:"Plain ROM",priority:1013,priorityForRom:function(a){return a.content.length>0&&a.content.length<=4194304?this.priority:null},createFromROM:function(a){return new wmsx.SlotPlainROM(a)},recreateFromSaveState:function(a,b){return wmsx.SlotPlainROM.recreateFromSaveState(a,b)}},DiskPatch:{name:"DiskPatch",desc:"Generic Patched Disk BIOS",priority:1301,internal:!0,embeddedURL:"@[DiskPatch].rom",priorityForRom:function(a){return a.content.length>=16384&&a.content.length<=65536?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeDiskPatched(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeDiskPatched.recreateFromSaveState(a,b)}},Nextor16Patch:{name:"Nextor16Patch",desc:"Nextor ASCII-16 Patched Kernel",priority:1302,internal:!0,embeddedURL:"@[Nextor16Patch].rom",priorityForRom:function(a){return 131072===a.content.length&&65===a.content[0]&&66===a.content[1]?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeNextorPatched(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeNextorPatched.recreateFromSaveState(a,b)}},SCCExpansion:{name:"SCCExpansion",desc:"Konami SCC Sound Cartridge",priority:1501,internal:!0,embeddedURL:"@[SCCExpansion].rom",priorityForRom:function(a){return 0===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeSCCExpansion(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeSCCExpansion.recreateFromSaveState(a,b)}},SCCIExpansion:{name:"SCCIExpansion",desc:"Konami SCC+ Sound Mapper Cartridge",priority:1502,internal:!0,embeddedURL:"@[SCCIExpansion].rom",priorityForRom:function(a){return a.content.length<=131072?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeSCCIExpansion(a,this,!1)},recreateFromSaveState:function(a,b){return wmsx.CartridgeSCCIExpansion.recreateFromSaveState(a,b)}},MSXMUSIC:{name:"MSXMUSIC",desc:"MSX-MUSIC Sound Extension",priority:1503,internal:!0,embeddedURL:"@[MSXMUSIC].rom",priorityForRom:function(a){return 16384===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeMSXMUSIC(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeMSXMUSIC.recreateFromSaveState(a,b)}},PACExpansion:{name:"PACExpansion",desc:"PAC SRAM Cartridge",priority:1505,internal:!0,embeddedURL:"@[PACExpansion].rom",priorityForRom:function(a,b){ return 0===a.content.length?this.priority:!wmsx.CartridgePAC.isPACFileContentValid(a.content)||b&&b.format!==wmsx.SlotFormats.PACExpansion&&b.format!==wmsx.SlotFormats.FMPAC?null:this.priority-wmsx.SlotCreator.FORMAT_PRIORITY_BOOST},createFromROM:function(a){return new wmsx.CartridgePAC(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgePAC.recreateFromSaveState(a,b)}},Kanji1:{name:"Kanji1",desc:"Kanji Font Driver",priority:1506,internal:!0,embeddedURL:"@[Kanji1].rom",priorityForRom:function(a){return 131072===a.content.length||262144===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeKanjiFont(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeKanjiFont.recreateFromSaveState(a,b)}},OPL4:{name:"OPL4",desc:"OPL4 Sound Cartridge",priority:1507,internal:!0,embeddedURL:"@[OPL4].rom",priorityForRom:function(a){return 2097152===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeOPL4(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeOPL4.recreateFromSaveState(a,b)}},ExtraPSG:{name:"ExtraPSG",desc:"Extra PSG Sound Chip",priority:1508,internal:!0,embeddedURL:"@[ExtraPSG].rom",priorityForRom:function(a){return 0===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeExtraPSG(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeExtraPSG.recreateFromSaveState(a,b)}},MegaRAM:{name:"MegaRAM",desc:"MegaRAM Mapper Cartridge",priority:1509,internal:!0,embeddedURL:"@[MegaRAM].rom",priorityForRom:function(a){return a.content.length<=2097152?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeMegaRAM(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeMegaRAM.recreateFromSaveState(a,b)}},V9990:{name:"V9990",desc:"V9990 Video Cartridge",priority:1510,internal:!0,embeddedURL:"@[V9990].rom",priorityForRom:function(a){return 0===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeV9990(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeV9990.recreateFromSaveState(a,b)}},Normal:{name:"Normal",desc:"Normal ROM, Mirroring Auto",priority:901,priorityForRom:function(a){return a.content.length>=128&&a.content.length<=16384&&65===a.content[0]&&66===a.content[1]?this.priority:a.content.length<=32768&&(65===a.content[0]&&66===a.content[1]||65===a.content[16384]&&66===a.content[16385])?this.priority:a.content.length>32768&&a.content.length<=65536&&(65===a.content[16384]&&66===a.content[16385]||65===a.content[32768]&&66===a.content[32769])?this.priority:null},createFromROM:function(a){return new wmsx.SlotNormal(a,this)},recreateFromSaveState:function(a,b){return wmsx.SlotNormal.recreateFromSaveState(a,b)}},Mirrored:{name:"Mirrored",desc:"Normal ROM, Mirrored",priority:902,priorityForRom:function(a){return wmsx.SlotFormats.Normal.priorityForRom(a)},createFromROM:function(a){return new wmsx.SlotNormal(a,this)},recreateFromSaveState:function(a,b){return wmsx.SlotNormal.recreateFromSaveState(a,b)}},NotMirrored:{name:"NotMirrored",desc:"Normal ROM, Not Mirrored",priority:903,priorityForRom:function(a){return wmsx.SlotFormats.Normal.priorityForRom(a)},createFromROM:function(a){return new wmsx.SlotNormal(a,this)},recreateFromSaveState:function(a,b){return wmsx.SlotNormal.recreateFromSaveState(a,b)}},ASCII8:{name:"ASCII8",desc:"ASCII 8K Mapper Cartridge",priority:911,priorityForRom:function(a){return a.content.length>=8192&&0==(8191&a.content.length)&&65===a.content[0]&&66===a.content[1]?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeASCII8K(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeASCII8K.recreateFromSaveState(a,b)}},ASCII16:{name:"ASCII16",desc:"ASCII 16K Mapper Cartridge",priority:912,priorityForRom:function(a){return a.content.length>=16384&&0==(16383&a.content.length)&&65===a.content[0]&&66===a.content[1]?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeASCII16K(a,this)},recreateFromSaveState:function(a,b){return wmsx.CartridgeASCII16K.recreateFromSaveState(a,b)}},Konami:{name:"Konami",desc:"Konami Mapper Cartridge",priority:913,priorityForRom:function(a){return a.content.length>=8192&&0==(8191&a.content.length)&&65===a.content[0]&&66===a.content[1]?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeKonami(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeKonami.recreateFromSaveState(a,b)}},KonamiSCC:{name:"KonamiSCC",desc:"KonamiSCC Sound Mapper Cartridge",priority:914,priorityForRom:function(a){return a.content.length>=8192&&0==(8191&a.content.length)&&65===a.content[0]&&66===a.content[1]?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeKonamiSCC(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeKonamiSCC.recreateFromSaveState(a,b)}},KonamiSCCI:{name:"KonamiSCCI",desc:"Konami SCC+ Sound Mapper Cartridge (in SCC-I mode)",priority:1101,priorityForRom:function(a){return a.content.length>0&&a.content.length<=131072?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeSCCIExpansion(a,this,!0)},recreateFromSaveState:function(a,b){return wmsx.CartridgeSCCIExpansion.recreateFromSaveState(a,b)}},ASCII8SRAM2:{name:"ASCII8SRAM2",desc:"ASCII 8K SRAM 2K Mapper Cartridge",priority:1102,priorityForRom:function(a){return a.content.length>=8192&&a.content.length<=1048576&&0==(8191&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeASCII8KSRAM(a,this)},recreateFromSaveState:function(a,b){return wmsx.CartridgeASCII8KSRAM.recreateFromSaveState(a,b)}},ASCII8SRAM8:{name:"ASCII8SRAM8",desc:"ASCII 8K SRAM 8K Mapper Cartridge",priority:1103,priorityForRom:function(a){return a.content.length>=8192&&a.content.length<=1048576&&0==(8191&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeASCII8KSRAM(a,this)},recreateFromSaveState:function(a,b){return wmsx.CartridgeASCII8KSRAM.recreateFromSaveState(a,b)}},KoeiSRAM8:{name:"KoeiSRAM8",desc:"Koei SRAM 8K Mapper Cartridge",priority:1104,priorityForRom:function(a){return a.content.length>=8192&&a.content.length<=1048576&&0==(8191&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeASCII8KSRAM(a,this)},recreateFromSaveState:function(a,b){return wmsx.CartridgeASCII8KSRAM.recreateFromSaveState(a,b)}},KoeiSRAM32:{name:"KoeiSRAM32",desc:"Koei SRAM 32K Mapper Cartridge",priority:1105,priorityForRom:function(a){return a.content.length>=8192&&a.content.length<=1048576&&0==(8191&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeASCII8KSRAM(a,this)},recreateFromSaveState:function(a,b){return wmsx.CartridgeASCII8KSRAM.recreateFromSaveState(a,b)}},Wizardry:{name:"Wizardry",desc:"Wizardry SRAM Mapper Cartridge",priority:1106,priorityForRom:function(a){return a.content.length>=8192&&a.content.length<=1048576&&0==(8191&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeASCII8KSRAM(a,this)},recreateFromSaveState:function(a,b){return wmsx.CartridgeASCII8KSRAM.recreateFromSaveState(a,b)}},ASCII16SRAM2:{name:"ASCII16SRAM2",desc:"ASCII 16K SRAM 2K Mapper Cartridge",priority:1107,priorityForRom:function(a){return a.content.length>=16384&&a.content.length<=2097152&&0==(16383&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeASCII16KSRAM(a,this)},recreateFromSaveState:function(a,b){return wmsx.CartridgeASCII16KSRAM.recreateFromSaveState(a,b)}},ASCII16SRAM8:{name:"ASCII16SRAM8",desc:"ASCII 16K SRAM 8K Mapper Cartridge",priority:1108,priorityForRom:function(a){return a.content.length>=16384&&a.content.length<=2097152&&0==(16383&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeASCII16KSRAM(a,this)},recreateFromSaveState:function(a,b){ return wmsx.CartridgeASCII16KSRAM.recreateFromSaveState(a,b)}},KonamiUltimateCollection:{name:"KonamiUltimateCollection",desc:"Konami Ultimate Collection SCC+/PCM Sound Mapper Cartridge",priority:1109,priorityForRom:function(a){return a.content.length<=8388608&&0==(8191&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeKonamiUltimateCollection(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeKonamiUltimateCollection.recreateFromSaveState(a,b)}},RType:{name:"RType",desc:"R-Type Mapper Cartridge",priority:1111,priorityForRom:function(a){return 393216===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeRType(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeRType.recreateFromSaveState(a,b)}},CrossBlaim:{name:"CrossBlaim",desc:"CrossBlaim Mapper Cartridge",priority:1112,priorityForRom:function(a){return 65536===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeCrossBlaim(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeCrossBlaim.recreateFromSaveState(a,b)}},Manbow2:{name:"Manbow2",desc:"Space Manbow 2 SCC Sound Mapper Cartridge",priority:1113,priorityForRom:function(a){return 524288===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeManbow2(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeManbow2.recreateFromSaveState(a,b)}},Majutsushi:{name:"Majutsushi",desc:"Konami Hai no Majutsushi PCM Mapper Cartridge",priority:1114,priorityForRom:function(a){return a.content.length>0&&0==(8191&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeMajutsushi(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeMajutsushi.recreateFromSaveState(a,b)}},Synthesizer:{name:"Synthesizer",desc:"Konami Synthesizer PCM Cartridge",priority:1115,priorityForRom:function(a){return a.content.length>0&&a.content.length<=32768&&0==(8191&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeSynthesizer(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeSynthesizer.recreateFromSaveState(a,b)}},GameMaster2:{name:"GameMaster2",desc:"Konami Game Master 2 SRAM Mapper Cartridge",priority:1116,priorityForRom:function(a){return 131072===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeGameMaster2(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeGameMaster2.recreateFromSaveState(a,b)}},HarryFox:{name:"HarryFox",desc:"HarryFox Mapper Cartridge",priority:1117,priorityForRom:function(a){return 65536===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeHarryFox(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeHarryFox.recreateFromSaveState(a,b)}},Halnote:{name:"Halnote",desc:"Halnote SRAM Mapper Cartridge",priority:1118,priorityForRom:function(a){return 1048576===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeHalnote(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeHalnote.recreateFromSaveState(a,b)}},AlQuran:{name:"AlQuran",desc:"The Holy Quran Mapper Cartridge (Encoded)",priority:1119,priorityForRom:function(a){return 1048576===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeAlQuran(a,this)},recreateFromSaveState:function(a,b){return wmsx.CartridgeAlQuran.recreateFromSaveState(a,b)}},AlQuranDecoded:{name:"AlQuranDecoded",desc:"The Holy Quran Mapper Cartridge (Decoded)",priority:1120,priorityForRom:function(a){return 1048576===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeAlQuran(a,this)},recreateFromSaveState:function(a,b){return wmsx.CartridgeAlQuran.recreateFromSaveState(a,b)}},SuperSwangi:{name:"SuperSwangi",desc:"Super Swangi Mapper Cartridge",priority:1121,priorityForRom:function(a){return a.content.length>=16384&&0==(16383&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeSuperSwangi(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeSuperSwangi.recreateFromSaveState(a,b)}},MSXWrite:{name:"MSXWrite",desc:"MSX Write Mapper Cartridge",priority:1122,priorityForRom:function(a){return 524288===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeASCII16K(a,this)},recreateFromSaveState:function(a,b){return wmsx.CartridgeASCII16K.recreateFromSaveState(a,b)}},Zemina80in1:{name:"Zemina80in1",desc:"Zemina 80 in 1 Mapper Cartridge",priority:1123,priorityForRom:function(a){return 0===(a.content.length>=8192&&8191&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeZemina80(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeZemina80.recreateFromSaveState(a,b)}},Zemina90in1:{name:"Zemina90in1",desc:"Zemina 90 in 1 Mapper Cartridge",priority:1124,priorityForRom:function(a){return 0===(a.content.length>=16384&&16383&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeZemina90(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeZemina90.recreateFromSaveState(a,b)}},Zemina126in1:{name:"Zemina126in1",desc:"Zemina 126 in 1 Mapper Cartridge",priority:1125,priorityForRom:function(a){return 0===(a.content.length>=16384&&16383&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeZemina126(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeZemina126.recreateFromSaveState(a,b)}},SuperLodeRunner:{name:"SuperLodeRunner",desc:"Super Lode Runner Mapper Cartridge",priority:1126,priorityForRom:function(a){return 0===(a.content.length>=16384&&16383&a.content.length)?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeSuperLodeRunner(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeSuperLodeRunner.recreateFromSaveState(a,b)}},Dooly:{name:"Dooly",desc:"Agigongnyong Dooly Mapper Cartridge",priority:1127,priorityForRom:function(a){return 32768===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeDooly(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeDooly.recreateFromSaveState(a,b)}},FMPAC:{name:"FMPAC",desc:"FM-PAC SRAM Sound Mapper Cartridge",priority:1151,priorityForRom:function(a){return 65536===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeFMPAC(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeFMPAC.recreateFromSaveState(a,b)}},MSXDOS2:{name:"MSXDOS2",desc:"MSX-DOS 2 Mapper Cartridge",priority:1504,embeddedURL:"@[MSXDOS2]v22.rom",priorityForRom:function(a){return 65536===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeDOS2(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeDOS2.recreateFromSaveState(a,b)}},DiskPatchDOS2TR:{name:"DiskPatchDOS2TR",desc:"TR MSX-DOS2 + Patched Disk BIOS",priority:1511,priorityForRom:function(a){return 65536===a.content.length?this.priority:null},createFromROM:function(a){return new wmsx.CartridgeDiskPatchedDOS2TR(a)},recreateFromSaveState:function(a,b){return wmsx.CartridgeDiskPatchedDOS2TR.recreateFromSaveState(a,b)}}},wmsx.SlotFormats.Expanded=wmsx.SlotFormats.Expanded3,wmsx.SlotFormats.MoonSound=wmsx.SlotFormats.OPL4,wmsx.SlotFormats.GenericKonami=wmsx.SlotFormats.Normal,wmsx.SlotFormats.Manbow2_2=wmsx.SlotFormats.Manbow2,wmsx.SlotFormats.HamarajaNight=wmsx.SlotFormats.Manbow2,wmsx.SlotFormats.Kanji12=wmsx.SlotFormats.Kanji1,wmsx.SlotFormats.FMPAK=wmsx.SlotFormats.FMPAC, wmsx.SlotFormatsUserOptions=["Normal","Mirrored","NotMirrored","ASCII8","ASCII16","Konami","KonamiSCC","KonamiSCCI","ASCII8SRAM2","ASCII8SRAM8","ASCII16SRAM2","ASCII16SRAM8","MegaRAM","GameMaster2","AlQuran","AlQuranDecoded","CrossBlaim","Dooly","Halnote","HarryFox","KoeiSRAM8","KoeiSRAM32","Majutsushi","Manbow2","MSXWrite","RType","SuperLodeRunner","SuperSwangi","Synthesizer","Wizardry","Zemina80in1","Zemina90in1","Zemina126in1","FMPAC","Kanji1","MSXDOS2","MSXMUSIC"],wmsx.Slot=function(){"use strict";this.connect=function(a){},this.refreshConnect=function(a){},this.disconnect=function(a){},this.getDataDesc=function(){},this.loadData=function(a,b){},this.getDataToSave=function(){},this.dataModified=function(){return!1},this.powerOn=function(){},this.powerOff=function(){},this.reset=function(){},this.read=function(a){return 255},this.write=function(a,b){},this.setDRAMMode=function(a){},this.getBreakWaitSub=function(a,b){return 0},this.getAccessWaitSub=function(a){return 0},this.cpuExtensionBegin=function(a){},this.cpuExtensionFinish=function(a){},this.isExpanded=function(){return!1},this.getSecondarySlotConfig=function(){return 0},this.reinsertROMContent=function(){this.rom.content||(this.rom.content=this.bytes||[])},this.lightState=function(){return WMSX.LIGHT_STATES&&wmsx.EmbeddedFiles.isEmbeddedURL(this.rom.source)},this.format=void 0,this.rom=void 0,this.bytes=void 0,this.dumpBytes=function(a,b,c){wmsx.Util.dump(this.bytes,a,b,c)},this.dumpRead=function(a,b,c){var d="",e=a||0;c=c||1;for(var f=0;f>14;return 0===b?g:1===b?h:2===b?i:j}function b(a){k=a,g=f[3&a],h=f[a>>2&3],i=f[a>>4&3],j=f[a>>6&3]}function c(){f=[l,l,l,l],d.subSlots=f}var d=this;this.isExpanded=function(){return!0},this.connect=function(a){e=a;for(var b=0;b<4;++b)f[b].connect(e)},this.refreshConnect=function(){for(var a=0;a<4;++a)f[a].refreshConnect()},this.disconnect=function(a){for(var b=0;b<4;++b)f[b].disconnect(a);e=null},this.powerOn=function(){b(0);for(var a=0;a<4;a++)f[a].powerOn()},this.powerOff=function(){for(var a=0;a<4;a++)f[a].powerOff()},this.reset=function(){b(0);for(var a=0;a<4;a++)f[a].reset()},this.isAllEmpty=function(){return f[0]===l&&f[1]===l&&f[2]===l&&f[3]===l},this.insertSubSlot=function(a,c){a=a||wmsx.SlotEmpty.singleton,f[c]!==a&&(e&&f[c].disconnect(e),f[c]=a,e&&f[c].connect(e),b(k))},this.getSubSlot=function(a){return f[a]},this.getSubSlotForAddress=a,this.read=function(a){var b=a>>14;return 0===b?g.read(a):1===b?h.read(a):2===b?i.read(a):65535===a?255&~k:j.read(a)},this.write=function(a,c){var d=a>>14;0===d?g.write(a,c):3===d?65535===a?b(c):j.write(a,c):1===d?h.write(a,c):i.write(a,c)},this.setSecondarySlotConfig=b,this.getSecondarySlotConfig=function(){return k},this.cpuExtensionBegin=function(b){return a(b.extPC).cpuExtensionBegin(b)},this.cpuExtensionFinish=function(b){return a(b.extPC).cpuExtensionFinish(b)};var e,f,g,h,i,j,k=0,l=wmsx.SlotEmpty.singleton;this.format=wmsx.SlotFormats.ExpandedS,this.saveState=function(){return{f:this.format.name,s:k,s0:f[0].saveState(),s1:f[1].saveState(),s2:f[2].saveState(),s3:f[3].saveState()}},this.loadState=function(a){this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s0,f[0]),0),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s1,f[1]),1),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s2,f[2]),2),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s3,f[3]),3),b(a.s)},function(){c()}()},wmsx.SlotExpanded.prototype=wmsx.Slot.base,wmsx.SlotExpanded.recreateFromSaveState=function(a,b){var c=b||new wmsx.SlotExpanded;return c.loadState(a),c},wmsx.SlotExpanded0=function(){"use strict";function a(a){var b=a>>14;return 0===b?g:1===b?h:2===b?i:j}function b(a){k=a,g=f[3&a],h=f[a>>2&3],i=f[a>>4&3],j=f[a>>6&3]}function c(){f=[l,l,l,l],d.subSlots=f}var d=this;this.isExpanded=function(){return!0},this.connect=function(a){e=a;for(var b=0;b<4;++b)f[b].connect(e)},this.refreshConnect=function(){for(var a=0;a<4;++a)f[a].refreshConnect()},this.disconnect=function(a){for(var b=0;b<4;++b)f[b].disconnect(a);e=null},this.powerOn=function(){b(0);for(var a=0;a<4;a++)f[a].powerOn()},this.powerOff=function(){for(var a=0;a<4;a++)f[a].powerOff()},this.reset=function(){b(0);for(var a=0;a<4;a++)f[a].reset()},this.isAllEmpty=function(){return f[0]===l&&f[1]===l&&f[2]===l&&f[3]===l},this.insertSubSlot=function(a,c){a=a||wmsx.SlotEmpty.singleton,f[c]!==a&&(e&&f[c].disconnect(e),f[c]=a,e&&f[c].connect(e),b(k))},this.getSubSlot=function(a){return f[a]},this.getSubSlotForAddress=a,this.read=function(a){var b=a>>14;return 0===b?g.read(a):2===b?i.read(a):3===b?65535===a?255&~k:j.read(a):h.read(a)},this.write=function(a,c){var d=a>>14;3===d?65535===a?b(c):j.write(a,c):0===d?g.write(a,c):1===d?h.write(a,c):i.write(a,c)},this.setSecondarySlotConfig=b,this.getSecondarySlotConfig=function(){return k},this.cpuExtensionBegin=function(b){return a(b.extPC).cpuExtensionBegin(b)},this.cpuExtensionFinish=function(b){return a(b.extPC).cpuExtensionFinish(b)};var e,f,g,h,i,j,k=0,l=wmsx.SlotEmpty.singleton;this.format=wmsx.SlotFormats.Expanded0,this.formatBack=wmsx.SlotFormats.Expanded,this.saveState=function(){return{f:this.format.name,s:k,s0:f[0].saveState(),s1:f[1].saveState(),s2:f[2].saveState(),s3:f[3].saveState()}},this.loadState=function(a){this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s0,f[0]),0),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s1,f[1]),1),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s2,f[2]),2),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s3,f[3]),3),b(a.s)},function(){c()}()},wmsx.SlotExpanded0.prototype=wmsx.Slot.base,wmsx.SlotExpanded0.recreateFromSaveState=function(a,b){var c=b||new wmsx.SlotExpanded0;return c.loadState(a),c},wmsx.SlotExpanded3=function(){"use strict";function a(a){var b=a>>14;return 0===b?h:1===b?i:2===b?j:k}function b(a){l=a,h=g[3&a],i=g[a>>2&3],j=g[a>>4&3],k=g[a>>6&3],f&&f.setSlot3SecondaryConfig(a)}function c(){g=[m,m,m,m],d.subSlots=g}var d=this;this.isExpanded=function(){return!0},this.connect=function(a){e=a,f=e.bus;for(var c=0;c<4;++c)g[c].connect(e);b(l)},this.refreshConnect=function(){for(var a=0;a<4;++a)g[a].refreshConnect();b(l)},this.disconnect=function(a){for(var c=0;c<4;++c)g[c].disconnect(a);b(0),e=f=null},this.powerOn=function(){b(0);for(var a=0;a<4;a++)g[a].powerOn()},this.powerOff=function(){for(var a=0;a<4;a++)g[a].powerOff()},this.reset=function(){b(0);for(var a=0;a<4;a++)g[a].reset()},this.isAllEmpty=function(){return g[0]===m&&g[1]===m&&g[2]===m&&g[3]===m},this.insertSubSlot=function(a,c){a=a||wmsx.SlotEmpty.singleton,g[c]!==a&&(e&&g[c].disconnect(e),g[c]=a,e&&g[c].connect(e),b(l))},this.getSubSlot=function(a){return g[a]},this.getSubSlotForAddress=a,this.read=function(a){var b=a>>14;return 0===b?h.read(a):1===b?i.read(a):2===b?j.read(a):65535===a?255&~l:k.read(a)},this.write=function(a,c){var d=a>>14;0===d?h.write(a,c):3===d?65535===a?b(c):k.write(a,c):1===d?i.write(a,c):j.write(a,c)},this.setSecondarySlotConfig=b,this.getSecondarySlotConfig=function(){return l},this.cpuExtensionBegin=function(b){return a(b.extPC).cpuExtensionBegin(b)},this.cpuExtensionFinish=function(b){return a(b.extPC).cpuExtensionFinish(b)};var e,f,g,h,i,j,k,l=0,m=wmsx.SlotEmpty.singleton;this.format=wmsx.SlotFormats.Expanded3,this.formatBack=wmsx.SlotFormats.Expanded,this.saveState=function(){ return{f:this.format.name,s:l,s0:g[0].saveState(),s1:g[1].saveState(),s2:g[2].saveState(),s3:g[3].saveState()}},this.loadState=function(a){this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s0,g[0]),0),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s1,g[1]),1),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s2,g[2]),2),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s3,g[3]),3),b(a.s)},function(){c()}()},wmsx.SlotExpanded3.prototype=wmsx.Slot.base,wmsx.SlotExpanded3.recreateFromSaveState=function(a,b){var c=b||new wmsx.SlotExpanded3;return c.loadState(a),c},wmsx.SlotExpandedM=function(){"use strict";function a(){d=[e,e,e,e],b.subSlots=d}var b=this;this.isExpanded=function(){return!0},this.connect=function(a){c=a;for(var b=0;b<4;++b)d[b].connect(c)},this.refreshConnect=function(){for(var a=0;a<4;++a)d[a].refreshConnect()},this.disconnect=function(a){for(var b=0;b<4;++b)d[b].disconnect(a);c=null},this.powerOn=function(){for(var a=0;a<4;a++)d[a].powerOn()},this.powerOff=function(){for(var a=0;a<4;a++)d[a].powerOff()},this.reset=function(){for(var a=0;a<4;a++)d[a].reset()},this.isAllEmpty=function(){return d[0]===e&&d[1]===e&&d[2]===e&&d[3]===e},this.insertSubSlot=function(a,b){a=a||wmsx.SlotEmpty.singleton,d[b]!==a&&(c&&d[b].disconnect(c),d[b]=a,c&&d[b].connect(c))},this.getSubSlot=function(a){return d[a]},this.getSubSlotForAddress=function(a){},this.read=function(a){},this.write=function(a,b){},this.getSecondarySlotConfig=function(){},this.cpuExtensionBegin=function(a){},this.cpuExtensionFinish=function(a){};var c,d,e=wmsx.SlotEmpty.singleton;this.format=wmsx.SlotFormats.ExpandedM,this.saveState=function(){return{f:this.format.name,s0:d[0].saveState(),s1:d[1].saveState(),s2:d[2].saveState(),s3:d[3].saveState()}},this.loadState=function(a){this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s0,d[0]),0),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s1,d[1]),1),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s2,d[2]),2),this.insertSubSlot(wmsx.SlotCreator.recreateFromSaveState(a.s3,d[3]),3)},function(){a()}()},wmsx.SlotExpandedM.prototype=wmsx.Slot.base,wmsx.SlotExpandedM.recreateFromSaveState=function(a,b){var c=b||new wmsx.SlotExpandedM;return c.loadState(a),c},wmsx.SlotNormal=function(a,b){"use strict";function c(a){if(65!==d[a]||66!==d[a+1])return null;for(var b=null,c=65535,e=a+2;e<=a+8;e+=2){var f=d[e+1]<<8|d[e];0!==f&&(f>14,lowestBasicPage:null!==b?b>>14:null}}this.read=function(a){return a>=e&&a32768)k=0;else{var l=a.info.s?parseInt(a.info.s):-1;if(l>=0)k=l>>14;else{for(var m=null,n=null,o=0;o16384?k=0===o?3===m?2:1:0===m?0:1:(k=2===m?2:1,null===h&&2===k&&2===n&&(h=!1)),null===h&&(h=!0)}}h=!!h,e=k<<14,f=Math.min(e+j,65536),wmsx.Util.log("Address: 0x"+wmsx.Util.toHex4(e)+" - 0x"+wmsx.Util.toHex4(f-1)+", Mirrored: "+h)}(this)},wmsx.SlotNormal.prototype=wmsx.Slot.base,wmsx.SlotNormal.recreateFromSaveState=function(a,b){var c=b||new wmsx.SlotNormal;return c.loadState(a),c},wmsx.SlotPlainROM=function(a){"use strict";this.read=function(a){return a>=d&&a64&&(e=64),c=new Uint8Array(1024*e),d=65536-c.length,a.bytes=c}this.refreshConnect=function(){1024*WMSX.RAMNORMAL_SIZE!==c.length&&b(this,this.rom)},this.powerOff=function(){wmsx.Util.arrayFill(c,0)},this.read=function(a){return a>=d?c[a-d]:255},this.write=function(a,b){a>=d&&(c[a-d]=b)};var c;this.bytes=null;var d=0;this.rom=null,this.format=wmsx.SlotFormats.RAMNormal,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(c)}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),c=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,c),this.bytes=c,d=65536-c.length},a&&b(this,a)},wmsx.SlotRAMNormal.prototype=wmsx.Slot.base,wmsx.SlotRAMNormal.recreateFromSaveState=function(a,b){var c=b||new wmsx.SlotRAMNormal;return c.loadState(a),c},wmsx.SlotRAMMapper=function(rom){"use strict";function init(a,b){a.rom=b;for(var c=0;VALID_SIZES[c]>14)-1,pageReadBackOR=255&~pageMask,dramModeStart=bytes.length-65536}this.connect=function(a){trd=a.trd,a.bus.connectInputDevice(252,this.inputAll),a.bus.connectInputDevice(253,this.inputAll),a.bus.connectInputDevice(254,this.inputAll),a.bus.connectInputDevice(255,this.inputAll),a.bus.connectOutputDevice(252,this.outputFC),a.bus.connectOutputDevice(253,this.outputFD),a.bus.connectOutputDevice(254,this.outputFE),a.bus.connectOutputDevice(255,this.outputFF),trd.connectRAM(this)},this.refreshConnect=function(){1024*WMSX.RAMMAPPER_SIZE!==bytes.length&&(init(this,this.rom),trd&&trd.connectRAM(this))},this.disconnect=function(a){a.bus.disconnectInputDevice(252,this.inputAll),a.bus.disconnectInputDevice(253,this.inputAll),a.bus.disconnectInputDevice(254,this.inputAll),a.bus.disconnectInputDevice(255,this.inputAll),a.bus.disconnectOutputDevice(252,this.outputFC),a.bus.disconnectOutputDevice(253,this.outputFD),a.bus.disconnectOutputDevice(254,this.outputFE),a.bus.disconnectOutputDevice(255,this.outputFF),a.trd.disconnectRAM(this)},this.setDRAMMode=function(a){dramModeOff=!a},this.powerOn=function(){this.reset()},this.powerOff=function(){wmsx.Util.arrayFill(bytes,0)},this.reset=function(){page0Offset=page1Offset=page2Offset=page3Offset=0,dramModeOff=!0},this.outputFC=function(a){page0Offset=(a&pageMask)<<14},this.outputFD=function(a){page1Offset=((a&pageMask)<<14)-16384},this.outputFE=function(a){page2Offset=((a&pageMask)<<14)-32768},this.outputFF=function(a){page3Offset=((a&pageMask)<<14)-49152},this.inputAll=function(a){switch(255&a){case 252:return pageReadBackOR|page0Offset>>14;case 253:return pageReadBackOR|page1Offset+16384>>14;case 254:return pageReadBackOR|page2Offset+32768>>14;case 255:return pageReadBackOR|page3Offset+49152>>14}},this.read=function(a){var b=a>>14;return 3===b?bytes[a+page3Offset]:0===b?bytes[a+page0Offset]:2===b?bytes[a+page2Offset]:bytes[a+page1Offset]},this.write=function(a,b){ var c=a>>14;3===c?(dramModeOff||a+page3Offset>14)-1,page0Offset=a.p0,page1Offset=a.p1,page2Offset=a.p2,page3Offset=a.p3,pageReadBackOR=255&~pageMask,dramModeStart=bytes.length-65536,dramModeOff=!a.dr,trd&&trd.connectRAM(this)},rom&&init(this,rom),this.eval=function(str){return eval(str)}},wmsx.SlotRAMMapper.prototype=wmsx.Slot.base,wmsx.SlotRAMMapper.recreateFromSaveState=function(a,b){var c=b||new wmsx.SlotRAMMapper;return c.loadState(a),c},wmsx.SlotBIOS=function(a){"use strict";this.connect=function(a){b=a,b.setBIOS(this),b.trd.connectBIOS(this),i.connect(b),h.connect(this,b),j.connect(b)},this.disconnect=function(a){b=void 0,h&&h.disconnect(this,a),j&&j.disconnect(this,a),a.trd.disconnectBIOS(this),a.setBIOS(null)},this.connectRAM=function(a,b){e=a.bytes,g=e.length-b},this.disconnectRAM=function(a){e===a.bytes&&(e=void 0,f=!1)},this.getKeyboardExtension=function(){return i},this.getTurboDriver=function(){return j},this.powerOff=function(){j&&j.powerOff(),h&&h.powerOff()},this.reset=function(){j&&j.reset(),f=!1},this.setDRAMMode=function(a){f=!!a},this.read=function(a){return a=24576&&a<26624||a===h)return void(e=(b%g<<14)-16384);(a>=28672&&a<30720||a===i)&&(f=(b%g<<14)-32768)},this.read=function(a){return a<16384?255:a<32768?d[e+a]:a<49152?d[f+a]:255};var d;this.bytes=null;var e,f,g,h,i;this.rom=null,this.format=b,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(d),b1:e,b2:f,n:g}},this.loadState=function(a){this.format=wmsx.SlotFormats[a.f],this.rom=wmsx.ROM.loadState(a.r),d=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,d),this.bytes=d,e=a.b1,f=a.b2,g=a.n,c(this.format)},a&&function(e){e.rom=a,d=wmsx.Util.asNormalArray(a.content),e.bytes=d,g=d.length/16384|0,c(b)}(this)},wmsx.CartridgeASCII16K.prototype=wmsx.Slot.base,wmsx.CartridgeASCII16K.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeASCII16K;return c.loadState(a),c},wmsx.CartridgeKonami=function(a){"use strict";this.powerOn=function(){this.reset()},this.reset=function(){c=d=e=-16384},this.write=function(a,b){a>=24576&&a<32767?c=(b%f<<13)-24576:a>=32768&&a<40959?d=(b%f<<13)-32768:a>=40960&&a<49151&&(e=(b%f<<13)-40960)},this.read=function(a){switch(57344&a){case 16384:return b[a-16384];case 24576:return b[c+a];case 32768:return b[d+a];case 40960:return b[e+a];default:return 255}};var b;this.bytes=null;var c,d,e,f;this.rom=null,this.format=wmsx.SlotFormats.Konami,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b2:c,b3:d,b4:e,n:f}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r), b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.b2,d=a.b3,e=a.b4,f=a.n},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b,f=b.length/8192|0}(this)},wmsx.CartridgeKonami.prototype=wmsx.Slot.base,wmsx.CartridgeKonami.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeKonami;return c.loadState(a),c},wmsx.CartridgeRType=function(a){"use strict";this.powerOn=function(){this.reset()},this.reset=function(){c=-32768},this.write=function(a,b){a>=28672&&a<32768&&(c=(b%24<<14)-32768)},this.read=function(a){return a<16384?255:a<32768?b[229376+a]:a<49152?b[c+a]:255};var b;this.bytes=null;var c;this.rom=null,this.format=wmsx.SlotFormats.RType,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b2:c}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.b2},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b}(this)},wmsx.CartridgeRType.prototype=wmsx.Slot.base,wmsx.CartridgeRType.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeRType;return c.loadState(a),c},wmsx.CartridgeCrossBlaim=function(a){this.powerOn=function(){this.reset()},this.reset=function(){c=-16384},this.write=function(a,b){16453===a&&(c=((3&b)<<14)-32768)},this.read=function(a){return a<16384?255:a<32768?b[a-16384]:a<49152?b[c+a]:255};var b;this.bytes=null;var c;this.rom=null,this.format=wmsx.SlotFormats.CrossBlaim,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b1:c}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.b1},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b}(this)},wmsx.CartridgeCrossBlaim.prototype=wmsx.Slot.base,wmsx.CartridgeCrossBlaim.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeCrossBlaim;return c.loadState(a),c},wmsx.CartridgeDOS2=function(a){"use strict";this.connect=function(a){a.getDiskDriveSocket().dos2ROMConnected(this)},this.disconnect=function(a){a.getDiskDriveSocket().dos2ROMDisconnected(this)},this.powerOn=function(){this.reset()},this.reset=function(){c=-16384},this.write=function(a,b){32766===a&&(c=((3&b)<<14)-16384)},this.read=function(a){return a>=16384&&a<32768?b[c+a]:255};var b;this.bytes=null;var c;this.rom=null,this.format=wmsx.SlotFormats.MSXDOS2,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b1:c}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.b1},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b}(this)},wmsx.CartridgeDOS2.prototype=wmsx.Slot.base,wmsx.CartridgeDOS2.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeDOS2;return c.loadState(a),c},wmsx.CartridgeHarryFox=function(a){"use strict";this.powerOn=function(){this.reset()},this.reset=function(){c=d=-16384},this.write=function(a,b){if(a>=24576&&a<28672)return void(c=(1&b?32768:0)-16384);a>=28672&&a<32768&&(d=(1&b?49152:16384)-32768)},this.read=function(a){return a<16384?255:a<32768?b[c+a]:a<49152?b[d+a]:255};var b;this.bytes=null;var c,d;this.rom=null,this.format=wmsx.SlotFormats.HarryFox,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b1:c,b2:d}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.b1,d=a.b2},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b}(this)},wmsx.CartridgeHarryFox.prototype=wmsx.Slot.base,wmsx.CartridgeHarryFox.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeHarryFox;return c.loadState(a),c},wmsx.CartridgeAlQuran=function(a,b){"use strict";function c(){for(var a=new Array(256),b=0;b<256;++b)a[b]=77^(b<<4&80|b>>3&5|b<<1&160|b<<2&8|b>>6&2);for(var c=0,e=d.length;c>1)%d<<14)-32768)},this.read=function(a){return a<16384?255:a<32768?b[a-16384]:a<49152?b[c+a]:255};var b;this.bytes=null;var c,d;this.rom=null,this.format=wmsx.SlotFormats.SuperSwangi,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b2:c}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.b2,d=b.length/16384|0},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b,d=b.length/16384|0}(this)},wmsx.CartridgeSuperSwangi.prototype=wmsx.Slot.base,wmsx.CartridgeSuperSwangi.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeSuperSwangi;return c.loadState(a),c},wmsx.CartridgeZemina80=function(a){"use strict";this.powerOn=function(){this.reset()},this.reset=function(){c=d=e=f=-16384},this.write=function(a,b){switch(a){case 16384:return void(c=(b%g<<13)-16384);case 16385:return void(d=(b%g<<13)-24576);case 16386:return void(e=(b%g<<13)-32768);case 16387:f=(b%g<<13)-40960}},this.read=function(a){switch(57344&a){case 16384:return b[c+a];case 24576:return b[d+a];case 32768:return b[e+a];case 40960:return b[f+a];default:return 255}};var b;this.bytes=null;var c,d,e,f,g;this.rom=null,this.format=wmsx.SlotFormats.Zemina80in1,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b1:c,b2:d,b3:e,b4:f}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.b1,d=a.b2,e=a.b3,f=a.b4,g=b.length/8192|0},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b,g=b.length/8192|0}(this)},wmsx.CartridgeZemina80.prototype=wmsx.Slot.base,wmsx.CartridgeZemina80.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeZemina80;return c.loadState(a),c},wmsx.CartridgeZemina90=function(a){"use strict";this.connect=function(a){a.bus.connectOutputDevice(119,this.output77)},this.disconnect=function(a){a.bus.disconnectOutputDevice(119,this.output77)},this.powerOn=function(){this.reset()},this.reset=function(){this.output77(0)},this.read=function(a){return a<16384?255:a<32768?b[d+a]:a<49152?f?b[e+a^8192]:b[e+a]:255},this.output77=function(a,b){c=a;var g=63&a,h=a>>6;2===h?(d=((62&g)<<14)-16384,e=((1|g)<<14)-32768):(d=(g<<14)-16384,e=(g<<14)-32768),f=3===h};var b;this.bytes=null;var c,d,e,f;this.rom=null, this.format=wmsx.SlotFormats.Zemina90in1,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),bc:c}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,this.output77(a.bc)},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b}(this)},wmsx.CartridgeZemina90.prototype=wmsx.Slot.base,wmsx.CartridgeZemina90.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeZemina90;return c.loadState(a),c},wmsx.CartridgeZemina126=function(a){"use strict";this.powerOn=function(){this.reset()},this.reset=function(){c=d=-16384},this.write=function(a,b){if(16384===a)return void(c=(b%e<<14)-16384);16385===a&&(d=(b%e<<14)-32768)},this.read=function(a){return a<16384?255:a<32768?b[c+a]:a<49152?b[d+a]:255};var b;this.bytes=null;var c,d,e;this.rom=null,this.format=wmsx.SlotFormats.Zemina126in1,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b1:c,b2:d}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.b1,d=a.b2,e=b.length/16384|0},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b,e=b.length/16384|0}(this)},wmsx.CartridgeZemina126.prototype=wmsx.Slot.base,wmsx.CartridgeZemina126.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeZemina126;return c.loadState(a),c},wmsx.CartridgeSuperLodeRunner=function(a){"use strict";function b(a,b){0===a&&(d=(b%e<<14)-32768)}this.connect=function(a){a.bus.setWriteMonitor(b)},this.disconnect=function(a){a.bus.setWriteMonitor(null)},this.powerOn=function(){this.reset()},this.reset=function(){d=32768},this.read=function(a){return a>=32768&&a<49152?c[d+a]:255};var c;this.bytes=null;var d,e;this.rom=null,this.format=wmsx.SlotFormats.SuperLodeRunner,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(c),b1:d}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),c=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,c),this.bytes=c,d=a.b1,e=c.length/16384|0},a&&function(b){b.rom=a,c=wmsx.Util.asNormalArray(a.content),b.bytes=c,e=c.length/16384|0}(this)},wmsx.CartridgeSuperLodeRunner.prototype=wmsx.Slot.base,wmsx.CartridgeSuperLodeRunner.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeSuperLodeRunner;return c.loadState(a),c},wmsx.CartridgeDooly=function(a){"use strict";this.powerOn=function(){this.reset()},this.reset=function(){c=0},this.write=function(a,b){a>=16384&&a<49152&&(c=7&b)},this.read=function(a){if(a>=16384&&a<49152){var d=b[a-16384];switch(c){case 0:return d;case 1:return 248&d|d<<2&4|d>>1&3;case 4:return 248&d|d>>2&1|d<<1&6;case 2:case 5:case 6:switch(7&d){case 1:case 2:case 4:return 248&d;case 3:case 5:case 6:if(2==c)return 248&d|7^(d<<2&4|d>>1&3);if(5==c)return 7^d;if(6==c)return 248&d|7^(d>>2&1|d<<1&6);default:return d}default:return 7|d}}return 255};var b;this.bytes=null;var c;this.rom=null,this.format=wmsx.SlotFormats.Dooly,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),e:c}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.e},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b}(this)},wmsx.CartridgeDooly.prototype=wmsx.Slot.base,wmsx.CartridgeDooly.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeDooly;return c.loadState(a),c},wmsx.CartridgeMegaRAM=function(a){"use strict";this.reinsertROMContent=function(){this.rom.content&&this.rom.content.length||(this.rom.content=this.bytes.slice(0,this.bytes.length))},this.connect=function(a){a.bus.connectInputDevice(142,this.input8E),a.bus.connectOutputDevice(142,this.output8E)},this.disconnect=function(a){a.bus.disconnectInputDevice(142,this.input8E),a.bus.disconnectOutputDevice(142,this.output8E)},this.powerOn=function(){this.reset()},this.reset=function(){h=!1},this.input8E=function(){return h=!0,255},this.output8E=function(a){h=!1},this.write=function(a,i){if(!(a<16384))return a<24576?void(h?b[d+a]=i:d=(i%c<<13)-16384):a<32768?void(h?b[e+a]=i:e=(i%c<<13)-24576):a<40960?void(h?b[f+a]=i:f=(i%c<<13)-32768):void(a<49152&&(h?b[g+a]=i:g=(i%c<<13)-40960))},this.read=function(a){switch(57344&a){case 16384:return b[d+a];case 24576:return b[e+a];case 32768:return b[f+a];case 40960:return b[g+a];default:return 255}};var b;this.bytes=null;var c,d=-16384,e=-16384,f=-16384,g=-16384,h=!1;this.rom=null,this.format=wmsx.SlotFormats.MegaRAM;var i=Math.min(WMSX.MEGARAM_SIZE/8,256),j=[32,64,128,256];this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b1:d,b2:e,b3:f,b4:g,n:c,m:h}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,d=a.b1,e=a.b2,f=a.b3,g=a.b4,c=a.n,h=a.m},a&&function(d){d.rom=a;var e=a.content;if(e&&e.length){c=Math.ceil(e.length/8192);for(var f=0;j[f]=d&&a=16384&&a<32768?c[d+a]:255},this.write=function(a,b){32752===a&&(d=((3&b)<<14)-16384)},this.cpuExtensionBegin=function(a){return e.cpuExtensionBegin(a)}, this.cpuExtensionFinish=function(a){return e.cpuExtensionFinish(a)};var c;this.bytes=null,this.rom=null,this.format=wmsx.SlotFormats.DiskPatchDOS2TR;var d,e=new wmsx.ImageDiskDriver(!0);this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:this.lightState()?null:wmsx.Util.compressInt8BitArrayToStringBase64(c),d:e.saveState(),b1:d}},this.loadState=function(a){if(this.rom=wmsx.ROM.loadState(a.r),a.b)c=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,c);else{this.rom.reloadEmbeddedContent();var f=this.rom.content.length;c&&c.length===f||(c=new Array(f)),wmsx.Util.arrayCopy(this.rom.content,0,c),b()}this.bytes=c,d=a.b1,e.loadState(a.d)},a&&function(d){d.rom=a,c=new Array(a.content.length),wmsx.Util.arrayCopy(a.content,0,c),d.bytes=c,b()}(this)},wmsx.CartridgeDiskPatchedDOS2TR.prototype=wmsx.Slot.base,wmsx.CartridgeDiskPatchedDOS2TR.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeDiskPatchedDOS2TR(null);return c.loadState(a),c},wmsx.CartridgeNextorPatched=function(a){"use strict";this.connect=function(a){d.connect(this,a),a.getDiskDriveSocket().hardDiskInterfaceConnected(this)},this.disconnect=function(a){d.disconnect(this,a),a.getDiskDriveSocket().hardDiskInterfaceDisconnected(this)},this.powerOn=function(){this.reset()},this.powerOff=function(){d.powerOff()},this.reset=function(){c=-16384},this.write=function(a,b){a>=24576&&a<26624&&(c=((7&b)<<14)-16384)},this.read=function(a){return a>=16384&&a<32768?b[c+a]:255},this.cpuExtensionBegin=function(a){return d.cpuExtensionBegin(a)},this.cpuExtensionFinish=function(a){return d.cpuExtensionFinish(a)};var b;this.bytes=null;var c;this.rom=null,this.format=wmsx.SlotFormats.Nextor16Patch;var d=new wmsx.ImageNextorDeviceDriver;this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:this.lightState()?null:wmsx.Util.compressInt8BitArrayToStringBase64(b),b1:c,d:d.saveState()}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),a.b?b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b):(this.rom.reloadEmbeddedContent(),b&&b.length===this.rom.content.length||(b=new Array(this.rom.content.length)),wmsx.Util.arrayCopy(this.rom.content,0,b)),d.patchNextorKernel(b),this.bytes=b,c=a.b1,d.loadState(a.d)},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b,d.patchNextorKernel(b)}(this)},wmsx.CartridgeNextorPatched.prototype=wmsx.Slot.base,wmsx.CartridgeNextorPatched.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeNextorPatched;return c.loadState(a),c},wmsx.CartridgeKonamiSCC=function(rom){"use strict";function init(a){a.rom=rom,bytes=wmsx.Util.asNormalArray(rom.content),a.bytes=bytes,numBanks=bytes.length/8192|0}function connectSCC(){scc.connectAudio(),sccConnected=!0}this.connect=function(a){scc.setAudioSocket(a.getAudioSocket()),sccConnected&&connectSCC()},this.disconnect=function(a){scc.disconnectAudio()},this.powerOn=function(){this.reset()},this.powerOff=function(){scc.disconnectAudio()},this.reset=function(){bank1Offset=bank2Offset=bank3Offset=bank4Offset=-16384,sccSelected=sccConnected=!1,scc.reset()},this.write=function(a,b){return a>=20480&&a<=22527?void(bank1Offset=(b%numBanks<<13)-16384):a>=28672&&a<=30719?void(bank2Offset=(b%numBanks<<13)-24576):a>=36864&&a<=38911?(bank3Offset=(b%numBanks<<13)-32768,void(63==(63&b)?(sccSelected=!0,sccConnected||connectSCC()):sccSelected=!1)):sccSelected&&a>=38912&&a<=40959?void scc.write(a,b):void(a>=45056&&a<=47103&&(bank4Offset=(b%numBanks<<13)-40960))},this.read=function(a){switch(57344&a){case 16384:return bytes[bank1Offset+a];case 24576:return bytes[bank2Offset+a];case 32768:return a>=38912&&sccSelected?scc.read(a):bytes[bank3Offset+a];case 40960:return bytes[bank4Offset+a];default:return 255}};var bytes;this.bytes=null;var bank1Offset,bank2Offset,bank3Offset,bank4Offset,numBanks,scc=new wmsx.SCCIAudio,sccSelected=!1,sccConnected=!1;this.rom=null,this.format=wmsx.SlotFormats.KonamiSCC,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(bytes),b1:bank1Offset,b2:bank2Offset,b3:bank3Offset,b4:bank4Offset,n:numBanks,scc:scc.saveState(),scs:sccSelected,scn:sccConnected}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),bytes=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,bytes),this.bytes=bytes,bank1Offset=a.b1,bank2Offset=a.b2,bank3Offset=a.b3,bank4Offset=a.b4,numBanks=a.n,scc.loadState(a.scc),sccSelected=a.scs,(sccConnected=a.scn)&&connectSCC()},rom&&init(this),this.eval=function(arg){return eval(arg)}},wmsx.CartridgeKonamiSCC.prototype=wmsx.Slot.base,wmsx.CartridgeKonamiSCC.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeKonamiSCC;return c.loadState(a),c},wmsx.CartridgeSCCExpansion=function(a){"use strict";function b(){c.connectAudio(),e=!0}this.connect=function(a){c.setAudioSocket(a.getAudioSocket()),e&&b()},this.disconnect=function(a){c.disconnectAudio()},this.powerOn=function(){this.reset()},this.powerOff=function(){c.disconnectAudio()},this.reset=function(){d=e=!1,c.reset()},this.write=function(a,f){if(a>=36864&&a<=38911)return void(63==(63&f)?(d=!0,e||b()):d=!1);d&&a>=38912&&a<=40959&&c.write(a,f)},this.read=function(a){return d&&a>=38912&&a<=40959?c.read(a):255};var c=new wmsx.SCCIAudio,d=!1,e=!1;this.rom=null,this.format=wmsx.SlotFormats.SCCExpansion,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),scc:c.saveState(),scs:d,scn:e}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),c.loadState(a.scc),d=a.scs,(e=a.scn)&&b()},a&&function(b){b.rom=a}(this)},wmsx.CartridgeSCCExpansion.prototype=wmsx.Slot.base,wmsx.CartridgeSCCExpansion.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeSCCExpansion;return c.loadState(a),c},wmsx.CartridgeSCCIExpansion=function(rom,format,startInSCCI){"use strict";function init(a){a.rom=rom;var b=rom.content;bytes=wmsx.Util.arrayFill(new Array(131072),255),a.bytes=bytes,b.length>0&&(a.preLoadedContentSize=b.length,wmsx.Util.arrayCopy(b,0,bytes),b.length<=65536&&wmsx.Util.arrayCopy(b,0,bytes,65536)),startingMode=startInSCCI?32:0}function setMode(a){mode=a,scciMode=0!=(32&a),scc.setSCCIMode(scciMode);var b=0!=(16&a);bank4RamMode=b,bank3RamMode=b||scciMode&&0!=(4&a),bank2RamMode=b||0!=(2&a),bank1RamMode=b||0!=(1&a)}function connectSCC(){scc.connectAudio(),sccConnected=!0}this.reinsertROMContent=function(){this.rom.content||(this.rom.content=this.bytes?this.bytes.slice(0,this.preLoadedContentSize):[])},this.connect=function(a){scc.setAudioSocket(a.getAudioSocket()),sccConnected&&connectSCC()},this.disconnect=function(a){scc.disconnectAudio()},this.powerOn=function(){this.reset()},this.powerOff=function(){scc.disconnectAudio(),0===this.preLoadedContentSize&&wmsx.Util.arrayFill(bytes,255)},this.reset=function(){bank1Offset=bank2Offset=bank3Offset=bank4Offset=-16384,sccSelected=scciSelected=sccConnected=!1,scc.reset(),setMode(startingMode)},this.read=function(a){switch(57344&a){case 16384:return bytes[bank1Offset+a];case 24576:return bytes[bank2Offset+a];case 32768:return a>=38912&&sccSelected&&!scciMode?scc.read(a):bytes[bank3Offset+a];case 40960:return a>=47104&&scciSelected&&scciMode?scc.read(a):bytes[bank4Offset+a];default:return 255}},this.write=function(a,b){if(49150===a||49151===a)return void setMode(b);switch(57344&a){case 16384:return void(bank1RamMode?bytes[bank1Offset+a]=b:a>=20480&&a<=22527&&(bank1Offset=((15&b)<<13)-16384));case 24576:return void(bank2RamMode?bytes[bank2Offset+a]=b:a>=28672&&a<=30719&&(bank2Offset=((15&b)<<13)-24576));case 32768:return void(bank3RamMode?bytes[bank3Offset+a]=b:a>=36864&&a<=38911?(bank3Offset=((15&b)<<13)-32768,(sccSelected=63==(63&b))&&!sccConnected&&connectSCC()):a>=38912&&sccSelected&&!scciMode&&scc.write(a,b));case 40960:bank4RamMode?bytes[bank4Offset+a]=b:a>=45056&&a<=47103?(bank4Offset=((15&b)<<13)-40960, (scciSelected=128==(128&b))&&!sccConnected&&connectSCC()):a>=47104&&scciSelected&&scciMode&&scc.write(a,b)}};var bytes;this.bytes=null;var startingMode=0,mode,scciMode,bank4RamMode,bank3RamMode,bank2RamMode,bank1RamMode,bank1Offset,bank2Offset,bank3Offset,bank4Offset,scc=new wmsx.SCCIAudio,sccSelected,scciSelected=!1,sccConnected=!1;this.rom=null,this.format=format,this.preLoadedContentSize=0,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),pcs:this.preLoadedContentSize,b:wmsx.Util.compressInt8BitArrayToStringBase64(bytes),sm:startingMode,m:mode,b1:bank1Offset,b2:bank2Offset,b3:bank3Offset,b4:bank4Offset,scc:scc.saveState(),scs:sccSelected,sis:scciSelected,scn:sccConnected}},this.loadState=function(a){this.format=wmsx.SlotFormats[a.f],this.rom=wmsx.ROM.loadState(a.r),this.preLoadedContentSize=a.pcs||0,bytes=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,bytes),this.bytes=bytes,bank1Offset=a.b1,bank2Offset=a.b2,bank3Offset=a.b3,bank4Offset=a.b4,startingMode=a.sm||0,setMode(void 0!==a.m?a.m:startingMode),scc.loadState(a.scc),sccSelected=a.scs,scciSelected=a.sis,(sccConnected=a.scn)&&connectSCC()},this.eval=function(str){return eval(str)},rom&&init(this)},wmsx.CartridgeSCCIExpansion.prototype=wmsx.Slot.base,wmsx.CartridgeSCCIExpansion.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeSCCIExpansion;return c.loadState(a),c},wmsx.CartridgeManbow2=function(rom){"use strict";function init(a){a.rom=rom,bytes=wmsx.Util.asNormalArray(rom.content),a.bytes=bytes}function writeMem(a,b){a>=458752&&a<524288&&(bytes[a]=b,sramModif||(sramModif=!0,cartridgeSocket.fireCartridgesModifiedStateUpdate()))}function connectSCC(){scc.connectAudio(),sccConnected=!0}this.getDataDesc=function(){return"SRAM"},this.loadData=function(a,b){if(65536!==b.length)return null;for(var c=0;c<65536;++c)bytes[458752+c]=b[c];return sramContentName=a,b},this.getDataToSave=function(){sramModif=!1,cartridgeSocket.fireCartridgesModifiedStateUpdate();var a=new Uint8Array(bytes.slice(458752));return{fileName:sramContentName||"Manbow2.sram",content:a,desc:this.getDataDesc()}},this.dataModified=function(){return sramModif},this.connect=function(a){cartridgeSocket=a.getCartridgeSocket(),scc.setAudioSocket(a.getAudioSocket()),sccConnected&&connectSCC()},this.disconnect=function(a){scc.disconnectAudio()},this.powerOn=function(){this.reset()},this.powerOff=function(){scc.disconnectAudio()},this.reset=function(){bank1Offset=bank2Offset=bank3Offset=bank4Offset=-16384,sccSelected=sccConnected=!1,scc.reset()},this.read=function(a){switch(57344&a){case 16384:return bytes[bank1Offset+a];case 24576:return bytes[bank2Offset+a];case 32768:return sccSelected&&a>=38912?scc.read(a):bytes[bank3Offset+a];case 40960:return bytes[bank4Offset+a];default:return 255}},this.write=function(a,b){switch(57344&a){case 16384:return writeMem(bank1Offset+a,b),void(a>=20480&&a<=22527&&(bank1Offset=((b&bankSelMask)<<13)-16384));case 24576:return writeMem(bank2Offset+a,b),void(a>=28672&&a<=30719&&(bank2Offset=((b&bankSelMask)<<13)-24576));case 32768:return sccSelected&&a>=38912&&scc.write(a,b),writeMem(bank3Offset+a,b),void(a>=36864&&a<=38911&&(bank3Offset=((b&bankSelMask)<<13)-32768,(sccSelected=63==(63&b))&&!sccConnected&&connectSCC()));case 40960:writeMem(bank4Offset+a,b),a>=45056&&a<=47103&&(bank4Offset=8192*(b&bankSelMask)-40960)}};var bytes;this.bytes=null;var bank1Offset,bank2Offset,bank3Offset,bank4Offset,bankSelMask=63,scc=new wmsx.SCCIAudio,sccSelected=!1,sccConnected=!1,sramContentName,sramModif=!1,cartridgeSocket;this.rom=null,this.format=wmsx.SlotFormats.Manbow2,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(bytes),b1:bank1Offset,b2:bank2Offset,b3:bank3Offset,b4:bank4Offset,scc:scc.saveState(),scs:sccSelected,scn:sccConnected,sn:sramContentName,d:sramModif}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),bytes=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,bytes),this.bytes=bytes,bank1Offset=a.b1,bank2Offset=a.b2,bank3Offset=a.b3,bank4Offset=a.b4,scc.loadState(a.scc),sccSelected=a.scs,sccConnected=a.scn,sramContentName=a.sn,sramModif=!!a.d,sccConnected&&connectSCC()},this.eval=function(str){return eval(str)},rom&&init(this)},wmsx.CartridgeManbow2.prototype=wmsx.Slot.base,wmsx.CartridgeManbow2.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeManbow2;return c.loadState(a),c},wmsx.CartridgeKonamiUltimateCollection=function(rom){"use strict";function init(a){a.rom=rom,bytes=wmsx.Util.arrayFill(new Array(8388608),255),a.bytes=bytes,rom.content.length>0&&wmsx.Util.arrayCopy(rom.content,0,bytes)}function setSCCMode(a){sccMode=48&a,scc.setSCCIMode(0!=(32&a))}function connectSCC(){scc.connectAudio(),sccConnected=!0}function connectPCM(){pcm.connectAudio(),pcmConnected=!0}this.getDataDesc=function(){return"Flash"},this.loadData=function(a,b){return 0===b.length||b.length>8388608||0!=(8191&rom.content.length)?null:(wmsx.Util.arrayCopy(b,0,bytes),sramContentName=a,b)},this.getDataToSave=function(){sramModif=!1,cartridgeSocket.fireCartridgesModifiedStateUpdate();var a=new Uint8Array(bytes);return{fileName:sramContentName||"KonamiUltimateCollection.dat",content:a,desc:this.getDataDesc()}},this.dataModified=function(){return sramModif},this.connect=function(a){cartridgeSocket=a.getCartridgeSocket(),scc.setAudioSocket(a.getAudioSocket()),pcm.setAudioSocket(a.getAudioSocket()),sccConnected&&connectSCC(),pcmConnected&&connectPCM()},this.disconnect=function(a){scc.disconnectAudio(),pcm.disconnectAudio()},this.powerOn=function(){this.reset()},this.powerOff=function(){scc.disconnectAudio(),pcm.disconnectAudio(),this.reset()},this.reset=function(){mapperMode=0,banksOffset=0,addressOffset=0,bank1No=0,bank2No=1,bank3No=2,bank4No=3,sccSelected=scciSelected=sccConnected=!1,pcmConnected=!1,scc.reset(),setSCCMode(0),pcm.reset()},this.read=function(a){switch(57344&a){case 16384:return bytes[addressOffset|(bank1No+banksOffset&255)<<13|8191&a];case 24576:return bytes[addressOffset|(bank2No+banksOffset&255)<<13|8191&a];case 32768:return!(256&a)&&a>=38912&&a<40958&&sccSelected&&0===sccMode?scc.read(a):bytes[addressOffset|(bank3No+banksOffset&255)<<13|8191&a];case 40960:return!(256&a)&&a>=47104&&a<49150&&scciSelected&&32===sccMode?scc.read(a):bytes[addressOffset|(bank4No+banksOffset&255)<<13|8191&a];default:return 255}},this.write=function(a,b){if(!(256&a)&&(0===sccMode&&a>=38912&&a<40958&&sccSelected||32===sccMode&&a>=47104&&a<49150&&scciSelected))return scc.write(a,b);if(4&mapperMode||(32767===a?(mapperMode=b,addressOffset=(192&b)<<15):32766===a&&(banksOffset=b)),16&mapperMode)switch(57344&a){case 16384:bytes[addressOffset|(bank1No+banksOffset&255)<<13|8191&a]=b,sramModif=!0;break;case 24576:bytes[addressOffset|(bank2No+banksOffset&255)<<13|8191&a]=b,sramModif=!0;break;case 32768:bytes[addressOffset|(bank3No+banksOffset&255)<<13|8191&a]=b,sramModif=!0;break;case 40960:bytes[addressOffset|(bank4No+banksOffset&255)<<13|8191&a]=b,sramModif=!0}if(8&mapperMode&&16384==(49168&a)&&(pcmConnected||connectPCM(),pcm.setSampleValue(b)),!(2&mapperMode)){if(32&mapperMode)switch(57344&a){case 16384:!(8&mapperMode)&&a>=20480&&a<=22527&&(bank1No=b);break;case 24576:bank2No=b;break;case 32768:bank3No=b,sccSelected=63==(63&b);break;case 40960:bank4No=b,scciSelected=128==(128&b)}else switch(57344&a){case 16384:a>=20480&&a<=22527&&(bank1No=b);break;case 24576:a>=28672&&a<=30719&&(bank2No=b);break;case 32768:a>=36864&&a<=38911&&(bank3No=b,sccSelected=63==(63&b));break;case 40960:a>=45056&&a<=47103&&(bank4No=b,scciSelected=128==(128&b))}49150!==a&&49151!==a||setSCCMode(b),!sccSelected&&!scciSelected||sccConnected||connectSCC()}};var cartridgeSocket,bytes;this.bytes=null ;var mapperMode=0,banksOffset=0,addressOffset=0,bank1No=0,bank2No=1,bank3No=2,bank4No=3,scc=new wmsx.SCCIAudio,sccMode=0,sccSelected=!1,scciSelected=!1,sccConnected=!1,pcm=new wmsx.PCM8BitAudio,pcmConnected=!1,sramContentName,sramModif=!1;this.rom=null,this.format=wmsx.SlotFormats.KonamiUltimateCollection,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(bytes),mm:mapperMode,bo:banksOffset,ao:addressOffset,b1:bank1No,b2:bank2No,b3:bank3No,b4:bank4No,scm:sccMode,scc:scc.saveState(),scs:sccSelected,sis:scciSelected,scn:sccConnected,pcm:pcm.saveState(),pcn:pcmConnected}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),bytes=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,bytes),this.bytes=bytes,mapperMode=a.mm,banksOffset=a.bo,addressOffset=a.ao,bank1No=a.b1,bank2No=a.b2,bank3No=a.b3,bank4No=a.b4,setSCCMode(a.scm),scc.loadState(a.scc),sccSelected=a.scs,scciSelected=a.sis,sccConnected=a.scn,pcm.loadState(a.pcm),pcmConnected=a.pcn,sccConnected&&connectSCC(),pcmConnected&&connectPCM()},this.eval=function(str){return eval(str)},rom&&init(this)},wmsx.CartridgeKonamiUltimateCollection.prototype=wmsx.Slot.base,wmsx.CartridgeKonamiUltimateCollection.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeKonamiUltimateCollection;return c.loadState(a),c},wmsx.CartridgeKanjiFont=function(a){"use strict";var b=this;this.connect=function(a){a.bus.connectInputDevice(216,wmsx.DeviceMissing.inputPortIgnored),a.bus.connectInputDevice(217,this.inputD9),a.bus.connectOutputDevice(216,this.outputD8),a.bus.connectOutputDevice(217,this.outputD9),a.bus.connectInputDevice(218,wmsx.DeviceMissing.inputPortIgnored),a.bus.connectInputDevice(219,this.inputDB),a.bus.connectOutputDevice(218,this.outputDA),a.bus.connectOutputDevice(219,this.outputDB),wmsx.CartridgeKanjiFont.connectedInstance=this},this.disconnect=function(a){a.bus.disconnectInputDevice(216,wmsx.DeviceMissing.inputPortIgnored),a.bus.disconnectInputDevice(217,this.inputD9),a.bus.disconnectOutputDevice(216,this.outputD8),a.bus.disconnectOutputDevice(217,this.outputD9),a.bus.disconnectInputDevice(218,wmsx.DeviceMissing.inputPortIgnored),a.bus.disconnectInputDevice(219,this.inputDB),a.bus.disconnectOutputDevice(218,this.outputDA),a.bus.disconnectOutputDevice(219,this.outputDB),wmsx.CartridgeKanjiFont.connectedInstance===this&&(wmsx.CartridgeKanjiFont.connectedInstance=void 0)},this.powerOn=function(){this.reset()},this.powerOff=function(){},this.readKanji=function(a){return f||a<131072?c[a]:255},this.reset=function(){d=0,e=131072},this.read=function(a){return 255},this.write=function(a,b){},this.outputD8=function(a){d=129024&d|(63&a)<<5},this.outputD9=function(a){d=(63&a)<<11|2016&d},this.inputD9=function(){var a=b.readKanji(d);return d=131040&d|d+1&31,a},this.outputDA=function(a){e=260096&e|(63&a)<<5},this.outputDB=function(a){e=131072|(63&a)<<11|2016&e},this.inputDB=function(){var a=b.readKanji(e);return e=262112&e|e+1&31,a};var c,d=0,e=0,f=!1;this.bytes=null,this.rom=null,this.format=wmsx.SlotFormats.Kanji1,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:this.lightState()?null:wmsx.Util.compressInt8BitArrayToStringBase64(c),r1:d,r2:e,j2:f}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),a.b?c=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,c):(this.rom.reloadEmbeddedContent(),c&&c.length===this.rom.content.length||(c=new Array(this.rom.content.length)),wmsx.Util.arrayCopy(this.rom.content,0,c)),this.bytes=c,d=a.r1,e=131072|a.r2,f=a.j2},a&&function(b){b.rom=a,c=wmsx.Util.asNormalArray(a.content),b.bytes=c,f=262144===c.length}(this)},wmsx.CartridgeKanjiFont.prototype=wmsx.Slot.base,wmsx.CartridgeKanjiFont.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeKanjiFont;return c.loadState(a),c},wmsx.CartridgeKanjiFont.connectedInstance=void 0,wmsx.CartridgePAC=function(a){"use strict";function b(a,b){e=a;for(var d=wmsx.CartridgePAC.DATA_FILE_IDENTIFIER.length,f=0,g=c.length-2;f=16384&&a<=24573&&(c[a-16384]=b,g||(g=!0,f.fireCartridgesModifiedStateUpdate()))},this.read=function(a){return d&&a>=16384&&a<=24575?c[a-16384]:255};var c,d;this.sram=null;var e,f,g=!1;this.rom=null,this.format=wmsx.SlotFormats.PACExpansion,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),sa:d,s:wmsx.Util.compressInt8BitArrayToStringBase64(c),sn:e,d:g}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),d=a.sa,c=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.s,c),e=a.sn,g=!!a.d},a&&function(d){d.rom=a,c=wmsx.Util.arrayFill(new Array(8192),0),d.sram=c,0!==a.content.length&&b(a.source,a.content)}(this)},wmsx.CartridgePAC.prototype=wmsx.Slot.base,wmsx.CartridgePAC.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgePAC;return c.loadState(a),c},wmsx.CartridgePAC.isPACFileContentValid=function(a){return 8206===a.length&&wmsx.Util.int8BitArrayToByteString(a,0,wmsx.CartridgePAC.DATA_FILE_IDENTIFIER.length)==wmsx.CartridgePAC.DATA_FILE_IDENTIFIER},wmsx.CartridgePAC.buildPACFileContentToSave=function(a){var b=new Uint8Array(wmsx.CartridgePAC.DATA_FILE_IDENTIFIER.length+a.length-2);return b.set(wmsx.Util.byteStringToInt8BitArray(wmsx.CartridgePAC.DATA_FILE_IDENTIFIER)),b.set(a.slice(0,-2),wmsx.CartridgePAC.DATA_FILE_IDENTIFIER.length),b},wmsx.CartridgePAC.DATA_FILE_IDENTIFIER="PAC2 BACKUP DATA",wmsx.CartridgeMSXMUSIC=function(a){"use strict";this.connect=function(a){c.connect(a)},this.disconnect=function(a){c.disconnect(a)},this.powerOn=function(){c.powerOn(),this.reset()},this.powerOff=function(){c.powerOff()},this.reset=function(){c.reset()},this.read=function(a){return a>=16384&&a<32768?b[a-16384]:255};var b;this.bytes=null,this.rom=null,this.format=wmsx.SlotFormats.MSXMUSIC;var c=new wmsx.YM2413Audio("MSX-MUSIC");this.opll=c,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:this.lightState()?null:wmsx.Util.compressInt8BitArrayToStringBase64(b),fm:c.saveState()}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),a.b?b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b):(this.rom.reloadEmbeddedContent(),b&&b.length===this.rom.content.length||(b=new Array(this.rom.content.length)),wmsx.Util.arrayCopy(this.rom.content,0,b)),this.bytes=b,c.loadState(a.fm)},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b}(this)},wmsx.CartridgeMSXMUSIC.prototype=wmsx.Slot.base,wmsx.CartridgeMSXMUSIC.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeMSXMUSIC;return c.loadState(a),c},wmsx.CartridgeFMPAC=function(a){"use strict";function b(){k&&(1&i?m.connect(k):m.disconnect(k))}function c(a,b){g=a;for(var c=wmsx.CartridgePAC.DATA_FILE_IDENTIFIER.length,d=0,f=e.length-2;d=16384&&a<=24573&&(e[a-16384]=c,l||(l=!0,h.fireCartridgesModifiedStateUpdate()))},this.read=function(a){return 32758===a?i:32759===a?j+16384>>14:f?a>=16384&&a<=24575?e[a-16384]:255:a>=16384&&a<32768?d[j+a]:255};var d;this.bytes=null;var e,f;this.sram=null;var g,h,i,j,k,l=!1;this.rom=null,this.format=wmsx.SlotFormats.FMPAC;var m=new wmsx.YM2413Audio("FM-PAC");this.opll=m,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(d),b1:j,fe:i,sa:f,s:wmsx.Util.compressInt8BitArrayToStringBase64(e),sn:g,fm:m.saveState(),d:l}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),d=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,d),this.bytes=d,j=a.b1,i=a.fe,f=a.sa,e=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.s,e),g=a.sn,m.loadState(a.fm),l=!!a.d,b()},a&&function(b){b.rom=a,d=wmsx.Util.asNormalArray(a.content),b.bytes=d,e=wmsx.Util.arrayFill(new Array(8192),0),b.sram=e}(this)},wmsx.CartridgeFMPAC.prototype=wmsx.Slot.base,wmsx.CartridgeFMPAC.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeFMPAC;return c.loadState(a),c},wmsx.CartridgeOPL4=function(a){"use strict";this.connect=function(a){c.connect(a)},this.disconnect=function(a){c.disconnect(a)},this.powerOn=function(){c.powerOn(),this.reset()},this.powerOff=function(){c.powerOff()},this.reset=function(){c.reset()},this.opl4ReadMemory=function(a){return b[4194303&a]},this.opl4WriteMemory=function(a,c){(4194303&a)<2097152||(b[4194303&a]=c)};var b;this.bytes=null,this.rom=null,this.format=wmsx.SlotFormats.OPL4;var c=new wmsx.OPL4Audio("OPL4",this);this.opl4=c,this.saveState=function(){var a=this.lightState();return{f:this.format.name,r:this.rom.saveState(),b:a?null:wmsx.Util.compressInt8BitArrayToStringBase64(b),ra:a?wmsx.Util.compressInt8BitArrayToStringBase64(b,2097152,2097152):null,opl4:c.saveState()}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),a.b?b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b):(this.rom.reloadEmbeddedContent(),b||(b=new Array(4194304)),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.ra,b,!0,null,2097152),wmsx.Util.arrayCopy(this.rom.content,0,b)),this.bytes=b,c.loadState(a.opl4)},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content,0,4194304),wmsx.Util.arrayFill(b,0,2097152),c.bytes=b}(this)},wmsx.CartridgeOPL4.prototype=wmsx.Slot.base,wmsx.CartridgeOPL4.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeOPL4;return c.loadState(a),c},wmsx.CartridgeExtraPSG=function(a){"use strict";this.connect=function(a){b.setAudioSocket(a.getAudioSocket()),b.connectBus(a.bus)},this.disconnect=function(a){b.disconnectBus(a.bus)},this.powerOn=function(){b.powerOn()},this.powerOff=function(){b.powerOff()},this.reset=function(){b.reset()};var b=new wmsx.PSG(null,null,!0);this.rom=null,this.format=wmsx.SlotFormats.ExtraPSG,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),p:b.saveState()}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b.loadState(a.p)},a&&function(b){b.rom=a}(this)},wmsx.CartridgeExtraPSG.prototype=wmsx.Slot.base,wmsx.CartridgeExtraPSG.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeExtraPSG;return c.loadState(a),c},wmsx.CartridgeV9990=function(a){"use strict";function b(){switch(26&e){case 16:case 18:f=0;break;case 24:f=2;break;case 26:f=3;break;default:f=1}d.getVideoSignal().setOutputAutoMode(f)}var c=this;this.connect=function(a){d.connect(a,this),a.getVideoSocket().connectExternalVideoSignal(d.getVideoSignal()),a.bus.connectInputDevice(111,wmsx.DeviceMissing.inputPortIgnored),a.bus.connectOutputDevice(111,this.output6f)},this.disconnect=function(a){d.disconnect(a),a.getVideoSocket().disconnectExternalVideoSignal(d.getVideoSignal()),a.bus.disconnectInputDevice(111,wmsx.DeviceMissing.inputPortIgnored),a.bus.disconnectOutputDevice(111,this.output6f)},this.powerOn=function(){d.powerOn()},this.powerOff=function(){d.powerOff(),this.resetOutputAutoMode()},this.reset=function(){d.reset(),this.resetOutputAutoMode()},this.resetOutputAutoMode=function(){c.output6f(16)},this.v9990DisplayEnabled=function(){0===f&&this.output6f(0)},this.output6f=function(a){e=a,b()},this.rom=null,this.format=wmsx.SlotFormats.V9990;var d=new wmsx.V9990;this.v9990=d;var e=16,f=0;this.saveState=function(){this.lightState();return{f:this.format.name,r:this.rom.saveState(),c:e,vdp:d.saveState()}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),e=a.c,d.loadState(a.vdp),b()},a&&function(){c.rom=a}()},wmsx.CartridgeV9990.prototype=wmsx.Slot.base,wmsx.CartridgeV9990.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeV9990;return c.loadState(a),c},wmsx.CartridgeGameMaster2=function(a){"use strict";this.connect=function(a){h=a.getCartridgeSocket()},this.getDataDesc=function(){return"SRAM"},this.loadData=function(a,b){if(8192!==b.length)return null;for(var c=0;c<8192;++c)f[c]=b[c];return g=a,b},this.getDataToSave=function(){i=!1,h.fireCartridgesModifiedStateUpdate();var a=new Uint8Array(f);return{fileName:g||"GameMaster2.sram",content:a,desc:this.getDataDesc()}},this.dataModified=function(){return i},this.powerOn=function(){this.reset()},this.reset=function(){c=1,d=2,e=3},this.write=function(a,b){if(!(a<24576||a>=49152))return a<28672?void(c=b):a>=32768&&a<36864?void(d=b):a>=40960&&a<45056?void(e=b):void(a>=45056&&16&e&&(f[((32&e)<<7)+a-45056]=b,i||(i=!0,h.fireCartridgesModifiedStateUpdate())))},this.read=function(a){switch(57344&a){case 16384:return b[a-16384];case 24576:return 16&c?f[((32&c)<<7)+(a-24576&4095)]:b[((15&c)<<13)+a-24576];case 32768:return 16&d?f[((32&d)<<7)+(a-32768&4095)]:b[((15&d)<<13)+a-32768];case 40960:return 16&e?f[((32&e)<<7)+(a-40960&4095)]:b[((15&e)<<13)+a-40960];default:return 255}};var b;this.bytes=null;var c,d,e,f;this.sram=null;var g,h,i=!1;this.rom=null,this.format=wmsx.SlotFormats.GameMaster2,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b2:c,b3:d,b4:e,s:wmsx.Util.compressInt8BitArrayToStringBase64(f),sn:g,d:i}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.b2,d=a.b3,e=a.b4,f=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.s,f),this.sram=f,g=a.sn,i=!!a.d},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b,f=wmsx.Util.arrayFill(new Array(8192),0),c.sram=f}(this)},wmsx.CartridgeGameMaster2.prototype=wmsx.Slot.base,wmsx.CartridgeGameMaster2.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeGameMaster2;return c.loadState(a),c},wmsx.CartridgeASCII8KSRAM=function(a,b){"use strict";this.connect=function(a){n=a.getCartridgeSocket()},this.getDataDesc=function(){return"SRAM"},this.loadData=function(a,b){var c=l+1;if(b.length!==c)return null;for(var d=0;d=49152))return a<24576?void(p&&d&j&&(k[((3&d)<<13)+a-16384&l]=b,o||(o=!0,n.fireCartridgesModifiedStateUpdate()))):a<26624?void(d=b):a<28672?void(e=b):a<30720?void(f=b):a<32768?void(g=b):a<40960?void(f&j&&(k[((3&f)<<13)+a-32768&l]=b,o||(o=!0,n.fireCartridgesModifiedStateUpdate()))):void(g&j&&(k[((3&g)<<13)+a-40960&l]=b,o||(o=!0,n.fireCartridgesModifiedStateUpdate())))},this.read=function(a){ switch(57344&a){case 16384:return p&&d&j?k[((3&d)<<13)+a-16384&l]:c[((d&i)%h<<13)+a-16384];case 24576:return 0|c[((e&i)%h<<13)+a-24576];case 32768:return f&j?k[((3&f)<<13)+a-32768&l]:c[((f&i)%h<<13)+a-32768];case 40960:return g&j?k[((3&g)<<13)+a-40960&l]:c[((g&i)%h<<13)+a-40960];default:return 255}};var c;this.bytes=null;var d,e,f,g,h,i,j,k;this.sram=null;var l,m,n,o=!1,p=!1;this.rom=null,this.format=b,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(c),b1:d,b2:e,b3:f,b4:g,n:h,rsm:i,s:wmsx.Util.compressInt8BitArrayToStringBase64(k),sn:m,ssm:j,d:o}},this.loadState=function(a){this.format=wmsx.SlotFormats[a.f],this.rom=wmsx.ROM.loadState(a.r),c=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,c),this.bytes=c,d=a.b1,e=a.b2,f=a.b3,g=a.b4,h=a.n,i=a.rsm,p=this.format===wmsx.SlotFormats.KoeiSRAM8||this.format===wmsx.SlotFormats.KoeiSRAM32,k=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.s,k),this.sram=k,l=k.length-1,m=a.sn,j=a.ssm,o=!!a.d},a&&function(d){d.rom=a,c=wmsx.Util.asNormalArray(a.content),d.bytes=c,h=c.length/8192|0;var e=b===wmsx.SlotFormats.KoeiSRAM32?32768:b===wmsx.SlotFormats.ASCII8SRAM2?2048:8192;l=e-1,k=wmsx.Util.arrayFill(new Array(e),0),d.sram=k;var f=1<=24576&&a<26624?void(d=b):a>=28672&&a<30720?void(e=b):void(a>=32768&&a<49152&&e&h&&(i[a-32768&j]=b,m||(m=!0,l.fireCartridgesModifiedStateUpdate())))},this.read=function(a){switch(49152&a){case 16384:return d&h?i[a-16384&j]:c[((d&g)%f<<14)+a-16384];case 32768:return e&h?i[a-32768&j]:c[((e&g)%f<<14)+a-32768];default:return 255}};var c;this.bytes=null;var d,e,f,g,h,i;this.sram=null;var j,k,l,m=!1;this.rom=null,this.format=b,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(c),b1:d,b2:e,n:f,rsm:g,s:wmsx.Util.compressInt8BitArrayToStringBase64(i),sn:k,ssm:h,d:m}},this.loadState=function(a){this.format=wmsx.SlotFormats[a.f],this.rom=wmsx.ROM.loadState(a.r),c=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,c),this.bytes=c,d=a.b1,e=a.b2,f=a.n,g=a.rsm,i=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.s,i),this.sram=i,j=i.length-1,k=a.sn,h=a.ssm,m=!!a.d},a&&function(d){d.rom=a,c=wmsx.Util.asNormalArray(a.content),d.bytes=c,f=c.length/16384|0;var e=b===wmsx.SlotFormats.ASCII16SRAM2?2048:8192;j=e-1,i=wmsx.Util.arrayFill(new Array(e),0),d.sram=i;var k=1<=28672&&i?b[(a<30720?g:h)+a]:b[d+a];case 32768:return b[e+a];case 40960:return b[f+a];default:return 255}};var b;this.bytes=null;var c,d,e,f,g,h,i,j;this.sram=null;var k,l,m,n=!1;this.rom=null,this.format=wmsx.SlotFormats.Halnote,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:this.lightState()?null:wmsx.Util.compressInt8BitArrayToStringBase64(b),b1:c,b2:d,b3:e,b4:f,sb1:g,sb2:h,sbe:i,s:wmsx.Util.compressInt8BitArrayToStringBase64(j),se:k,sn:l,d:n}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),a.b?b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b):(this.rom.reloadEmbeddedContent(),b&&b.length===this.rom.content.length||(b=new Array(this.rom.content.length)),wmsx.Util.arrayCopy(this.rom.content,0,b)),this.bytes=b,c=a.b1,d=a.b2,e=a.b3,f=a.b4,g=a.sb1,h=a.sb2,i=a.sbe,j=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.s,j),this.sram=j,k=a.se,l=a.sn,n=!!a.d},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b,j=wmsx.Util.arrayFill(new Array(16384),0),c.sram=j}(this)},wmsx.CartridgeHalnote.prototype=wmsx.Slot.base,wmsx.CartridgeHalnote.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeHalnote;return c.loadState(a),c},wmsx.CartridgeMajutsushi=function(a){"use strict";this.connect=function(a){g.setAudioSocket(a.getAudioSocket()),g.connectAudio()},this.disconnect=function(a){g.disconnectAudio()},this.powerOn=function(){this.reset(),g.connectAudio()},this.powerOff=function(){g.disconnectAudio(),this.reset()},this.reset=function(){c=d=e=-16384,g.reset()},this.write=function(a,b){a>=20480&&a<24575?g.setSampleValue(b):a>=24576&&a<32767?c=(b%f<<13)-24576:a>=32768&&a<40959?d=(b%f<<13)-32768:a>=40960&&a<49151&&(e=(b%f<<13)-40960)},this.read=function(a){switch(57344&a){case 16384:return b[a-16384];case 24576:return b[c+a];case 32768:return b[d+a];case 40960:return b[e+a];default:return 255}};var b;this.bytes=null;var c,d,e,f,g=new wmsx.PCM8BitAudio;this.rom=null,this.format=wmsx.SlotFormats.Majutsushi,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(),b:wmsx.Util.compressInt8BitArrayToStringBase64(b),b2:c,b3:d,b4:e,n:f,p:g.saveState()}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c=a.b2,d=a.b3,e=a.b4,f=a.n,g.loadState(a.p)},a&&function(c){c.rom=a,b=wmsx.Util.asNormalArray(a.content),c.bytes=b,f=b.length/8192|0}(this)},wmsx.CartridgeMajutsushi.prototype=wmsx.Slot.base,wmsx.CartridgeMajutsushi.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeMajutsushi;return c.loadState(a),c},wmsx.CartridgeSynthesizer=function(a){"use strict";this.connect=function(a){c.setAudioSocket(a.getAudioSocket()),c.connectAudio()},this.disconnect=function(a){c.disconnectAudio()},this.powerOn=function(){this.reset(),c.connectAudio()},this.powerOff=function(){c.disconnectAudio(),this.reset()},this.reset=function(){c.reset()},this.write=function(a,b){16384==(49168&a)&&c.setSampleValue(b)},this.read=function(a){return a>=16384&&a<49152?b[a-16384]:255};var b;this.bytes=null;var c=new wmsx.PCM8BitAudio;this.rom=null,this.format=wmsx.SlotFormats.Synthesizer,this.saveState=function(){return{f:this.format.name,r:this.rom.saveState(), b:wmsx.Util.compressInt8BitArrayToStringBase64(b),p:c.saveState()}},this.loadState=function(a){this.rom=wmsx.ROM.loadState(a.r),b=wmsx.Util.uncompressStringBase64ToInt8BitArray(a.b,b),this.bytes=b,c.loadState(a.p)},a&&function(c){c.rom=a,b=wmsx.Util.arrayFill(new Array(32768),255),c.bytes=b;for(var d=a.content.length,e=0;e<32768;++e)b[e]=a.content[e%d]}(this)},wmsx.CartridgeSynthesizer.prototype=wmsx.Slot.base,wmsx.CartridgeSynthesizer.recreateFromSaveState=function(a,b){var c=b||new wmsx.CartridgeSynthesizer;return c.loadState(a),c},wmsx.MachineTypeSocket=function(a){"use strict";this.getMachine=function(){return a.machineName},this.getMachineLang=function(){return WMSX.MACHINES_CONFIG[a.machineName].LANG||"en"},this.getMachineType=function(){return WMSX.MACHINES_CONFIG[a.machineName].TYPE||1},this.getCodeKeyLabel=function(){return WMSX.MACHINES_CONFIG[a.machineName].CODE_LABEL||"CODE"},this.getCodeLedLabel=function(){return WMSX.MACHINES_CONFIG[a.machineName].CODE_LABEL||"KANA"},this.changeMachine=function(b){if(a.machineName!==b){if(WMSX.MEDIA_CHANGE_DISABLED)return b.showOSD("Machine change is disabled!",!0,!0);var c=WMSX.MACHINES_CONFIG[b];if(c){var d=a.powerIsOn;a.powerOff();var e=a.systemPause(!0);WMSX.MACHINE=b,wmsx.Configurator.applyFinalConfig(),a.updateMachineType(),new wmsx.MultiDownloader(wmsx.Configurator.slotURLSpecs(),function(){a.getExtensionsSocket().propagateAllExtensions(),a.getExtensionsSocket().refreshSlotsFromConfig(function(){a.getSavestateSocket().externalStateChange(),a.showOSD((c.DESC||c.DESCX)+" machine activated",!0),e||a.systemPause(!1),d&&a.powerOn()})},function(a){wmsx.Util.message(a.errorMessage)}).start()}}},this.addMachineTypeStateListener=function(a,c){b.indexOf(a)<0&&(b.push(a),c||a.machineTypeStateUpdate())},this.fireMachineTypeStateUpdate=function(){for(var a=0;a>(a>>14<<1)&3;return 0===b?slot0:1===b?slot1:2===b?slot2:slot3}function create(){slot0=slot1=slot2=slot3=slotModules=slotEmpty,slots=[slot0,slot1,slot2,slot3,slotModules],devicesInputPorts=wmsx.Util.arrayFill(new Array(256),deviceInputMissing),devicesOutputPorts=wmsx.Util.arrayFill(new Array(256),deviceOutputMissing),switchedDevices=new wmsx.SwitchedDevices,switchedDevices.connect(self),self.slots=slots,self.devicesInputPorts=devicesInputPorts,self.devicesOutputPorts=devicesOutputPorts}var self=this;this.powerOn=function(){switchedDevices.reset(),this.setPrimarySlotConfig(0);for(var a=0;a<5;a++)slots[a].powerOn()},this.powerOff=function(){for(var a=0;a<5;a++)slots[a].powerOff()},this.reset=function(){vdpIOClock=0,switchedDevices.reset(),this.setDRAMMode(!1),this.setPrimarySlotConfig(0);for(var a=0;a<5;a++)slots[a].reset()},this.refreshConnect=function(){for(var a=0;a<5;++a)slots[a].refreshConnect()},this.insertSlot=function(a,b){if(a=a||slotEmpty,slots[b]!==a)switch(slots[b].disconnect(machine),slots[b]=a,slots[b].connect(machine),b){case 0:return void(slot0=a);case 1:return void(slot1=a);case 2:return void(slot2=a);case 3:return void(slot3=a);case 4:return void(slotModules=a)}},this.getSlot=function(a){return slots[a]},this.getSlotForAddress=getSlotForAddress,this.read=function(a){var b=primarySlotConfig>>(a>>14<<1)&3;return 3===b?slot3.read(a):1===b?slot1.read(a):0===b?slot0.read(a):slot2.read(a)}, this.write=function(a,b){var c=primarySlotConfig>>(a>>14<<1)&3;3===c?slot3.write(a,b):1===c?slot1.write(a,b):2===c?slot2.write(a,b):slot0.write(a,b)};var origWrite=this.write;this.writeWithBusMonitor=function(a,b){writeMonitor(a,b),origWrite(a,b)},this.setDRAMMode=function(a){dramMode=!!a,dramWait=0|!dramMode},this.setSlot3SecondaryConfig=function(a){slot3SecondaryConfig=a},this.getBreakWait=function(a,b){var c=a>>14<<1,d=primarySlotConfig>>c&3;return 3===d?(a^b)>>8?1:(d=slot3SecondaryConfig>>c&3,0===d?0:1===d?dramWait:1):0===d?(a^b)>>8?1:dramWait:1},this.getAccessWait=function(a){var b=a>>14<<1,c=primarySlotConfig>>b&3;return 3===c?(c=slot3SecondaryConfig>>b&3,0===c?0:1===c?dramWait:1):0===c?dramWait:2},this.input=function(a){return devicesInputPorts[255&a](a)},this.output=function(a,b){return devicesOutputPorts[255&a](b,a)},this.getIOWait=function(a,b){if(a>155||a<152)return 0;var c=vdpIOClock;vdpIOClock=cpu.getBUSCycles();var d=31-(vdpIOClock-c);return d>0?d*b:0},this.setPrimarySlotConfig=function(a){primarySlotConfig=a},this.getPrimarySlotConfig=function(){return primarySlotConfig},this.cpuExtensionBegin=function(a){if(a.extNum<240)return getSlotForAddress(a.extPC).cpuExtensionBegin(a);var b=cpuExtensionHandlers[a.extNum];return b?b.cpuExtensionBegin(a):void 0},this.cpuExtensionFinish=function(a){if(a.extNum<240)return getSlotForAddress(a.extPC).cpuExtensionFinish(a);var b=cpuExtensionHandlers[a.extNum];return b?b.cpuExtensionFinish(a):void 0},this.setCpuExtensionHandler=function(a,b){cpuExtensionHandlers[a]=b},this.connectInputDevice=function(a,b){devicesInputPorts[a]=b},this.connectOutputDevice=function(a,b){devicesOutputPorts[a]=b},this.disconnectInputDevice=function(a,b){b&&devicesInputPorts[a]!==b||(devicesInputPorts[a]=deviceInputMissing)},this.disconnectOutputDevice=function(a,b){b&&devicesOutputPorts[a]!==b||(devicesOutputPorts[a]=deviceOutputMissing)},this.setWriteMonitor=function(a){writeMonitor=a,this.write=writeMonitor?this.writeWithBusMonitor:origWrite},this.connectSwitchedDevice=function(a,b){switchedDevices.connectSwitchedDevice(a,b)},this.disconnectSwitchedDevice=function(a,b){switchedDevices.disconnectSwitchedDevice(a,b)};var slots,slot0,slot1,slot2,slot3,slotModules,primarySlotConfig=0,slot3SecondaryConfig=0,slotEmpty=wmsx.SlotEmpty.singleton,deviceInputMissing=wmsx.DeviceMissing.inputPort,deviceOutputMissing=wmsx.DeviceMissing.outputPort,devicesInputPorts,devicesOutputPorts,writeMonitor,switchedDevices,vdpIOClock=0,dramMode=!1,dramWait=0,cpuExtensionHandlers={};this.saveState=function(){return{p:primarySlotConfig,s0:slot0.saveState(),s1:slot1.saveState(),s2:slot2.saveState(),s3:slot3.saveState(),sM:slotModules.saveState(),d:dramMode,vc:vdpIOClock}},this.loadState=function(a){this.insertSlot(wmsx.SlotCreator.recreateFromSaveState(a.s0,slot0),0),this.insertSlot(wmsx.SlotCreator.recreateFromSaveState(a.s1,slot1),1),this.insertSlot(wmsx.SlotCreator.recreateFromSaveState(a.s2,slot2),2),this.insertSlot(wmsx.SlotCreator.recreateFromSaveState(a.s3,slot3),3),this.insertSlot(a.sM?wmsx.SlotCreator.recreateFromSaveState(a.sM,slotModules):slotEmpty,4),this.setDRAMMode(!!a.d),this.setPrimarySlotConfig(a.p),vdpIOClock=a.vc||0},init(),this.eval=function(str){return eval(str)}},wmsx.Machine=function(){"use strict";function init(){socketsCreate(),mainComponentsCreate(),computeBasicAutoRunCommandParameters()}function getSlot(a){"number"==typeof a&&(a=[a]);var b=a[0],c=a[1],d=bus.getSlot(b);return c>=0?d=d.isExpanded()?d.getSubSlot(c):null:d.isExpanded()&&(d=d.getSubSlot(0)),d}function getSlotDesc(a){var b="number"==typeof a?a:a[0];return b>3?void 0:b.toString()+(bus.getSlot(b).isExpanded()?"-"+(a[1]||0):"")}function insertSlot(a,b){"number"==typeof b&&(b=[b]);var c=!a||a===EMPTY_SLOT;if(!c||-1===e||(getSlot(b)||EMPTY_SLOT)!==EMPTY_SLOT){var d=b[0],e=b[1],f=bus.getSlot(d);if(e>=0){if(!f.isExpanded()){var g=f;f=0===d?new wmsx.SlotExpanded0:3===d?new wmsx.SlotExpanded3:4===d?new wmsx.SlotExpandedM:new wmsx.SlotExpanded,bus.insertSlot(f,d),g!==EMPTY_SLOT&&e>0&&f.insertSubSlot(g,0)}f.insertSubSlot(a,e),c&&f.isAllEmpty()&&bus.insertSlot(a,d)}else f.isExpanded()&&-1!==e?(f.insertSubSlot(a,0),c&&f.isAllEmpty()&&bus.insertSlot(a,d)):bus.insertSlot(a,d)}}function setVideoStandard(a,b,c){!1!==c&&self.showOSD((videoStandardIsAuto?"AUTO: ":"FORCED: ")+a.desc,!!c),(b||videoStandard!==a)&&(videoStandard=a,vdp.setVideoStandard(videoStandard),videoClockUpdateSpeed())}function setVideoStandardAuto(a){videoStandardIsAuto=!0;var b=wmsx.VideoStandard.NTSC;videoStandardSoft?b=videoStandardSoft:bios&&(bios.setVideoStandardUseOriginal(),b=bios.originalVideoStandard),setVideoStandard(b,!0,a)}function setVideoStandardForced(a){videoStandardIsAuto=!1,bios&&bios.setVideoStandardForced(a),setVideoStandard(a,!1,!0)}function setVSynchMode(a,b){(vSynchMode!==a||b)&&(vSynchMode=a<0?a:a%2,vdp.setVSynchMode(vSynchMode),videoClockUpdateSpeed())}function vSynchModeToggle(){if(vSynchMode<0||-1===videoClockSocket.getVSynchNativeFrequency())return self.showOSD("VSync is disabled / unsupported",!0,!0);setVSynchMode(vSynchMode+1),self.showOSD("VSync: "+(1===vSynchMode?"Auto ("+(videoClockSocket.isVSynchActive()?"ON":"OFF")+")":0===vSynchMode?"OFF":"DISABLED"),!0),WMSX.userPreferences.current.vSynch=vSynchMode,WMSX.userPreferences.setDirty(),WMSX.userPreferences.save()}function saveState(a){var b={cfg:wmsx.Configurator.saveState(),mn:self.machineName,mt:self.machineType,b:bus.saveState(),rc:rtc.saveState(),sf:syf.saveState(),td:trd.saveState(),pp:ppi.saveState(),ps:psg.saveState(),vd:vdp.saveState(a),c:cpu.saveState(),va:videoStandardIsAuto,vs:videoStandard.name,ctm:z80ClockMode,rtm:r800ClockMode,vtm:vdpClockMode,s:speedControl,br:basicAutoRunDone,bc:basicAutoRunCommand||"",vss:videoStandardSoft&&videoStandardSoft.name,vm:videoSocket.saveState(),dd:diskDriveSocket.saveState(),ct:cassetteSocket.saveState(),cs:controllersSocket.saveState()};return a&&(b.vy=vSynchMode,b.pw=self.powerIsOn,b.up=userPaused,b.upf=userPauseMoreFrames),b}function loadState(a){wmsx.Configurator.loadState(a,a.cfg),void 0!==a.vy&&setVSynchMode(a.vy,!0),void 0!==a.pw&&self.powerIsOn!==a.pw&&(a.pw?self.powerOn(!0):self.powerOff()),void 0!==a.up&&self.userPause(a.up),void 0!==a.upf&&(userPauseMoreFrames=a.upf),self.machineName=a.mn,self.machineType=a.mt,videoStandardIsAuto=a.va,setVideoStandard(wmsx.VideoStandard[a.vs]),videoStandardSoft=a.vss&&wmsx.VideoStandard[a.vss],speedControl=a.s||1,1===speedControl&&(speedControl=defaultSpeed),basicAutoRunDone=!!a.br,void 0!==a.bc&&(basicAutoRunCommand=a.bc),videoClockUpdateSpeed(),cpu.loadState(a.c),vdp.loadState(a.vd),psg.loadState(a.ps),ppi.loadState(a.pp),rtc.loadState(a.rc),syf.loadState(a.sf),trd.loadState(a.td),bus.loadState(a.b),videoSocket.loadState(a.vm),diskDriveSocket.loadState(a.dd),cassetteSocket.loadState(a.ct),a.cs&&controllersSocket.loadState(a.cs),machineTypeSocket.fireMachineTypeStateUpdate(),cartridgeSocket.fireCartridgesStateUpdate(),machineControlsSocket.firePowerAndUserPauseStateUpdate(),audioSocket.flushAllSignals(),diskDriveSocket.fireInterfacesChangeUpdate(),z80ClockMode=void 0!==a.ctm?a.ctm:cpu.getZ80ClockMulti()>1?cpu.getZ80ClockMulti():0,r800ClockMode=void 0!==a.rtm?a.rtm:cpu.getR800ClockMulti()>1?cpu.getR800ClockMulti():0,vdpClockMode=void 0!==a.vtm?a.vtm:vdp.getVDPTurboMulti()>1?vdp.getVDPTurboMulti():0,biosSocket.turboDriverTurboModesUpdate(),saveStateSocket.externalStateChange()}function videoClockUpdateSpeed(){var a=vdp.getDesiredVideoPulldown();videoClockSocket.setVSynch(1===vSynchMode);var b=a.frequency*(alternateSpeed||speedControl)|0;videoClockSocket.setFrequency(b,a.divider),audioSocket.setFps(b/a.divider),rtc.setFps(a.frequency/a.divider)}function mainComponentsCreate(){self.cpu=cpu=new wmsx.CPU,self.rtc=rtc=new wmsx.RTC(videoClockSocket),self.syf=syf=new wmsx.SystemFlags,self.trd=trd=new wmsx.TurboRDevices(cpu,ledsSocket), self.vdp=vdp=new wmsx.VDP(self,cpu,trd),self.psg=psg=new wmsx.PSG(controllersSocket,ledsSocket,!1),self.ppi=ppi=new wmsx.PPI(psg.getAudioChannel(),controllersSocket,ledsSocket),self.bus=bus=new wmsx.BUS(self,cpu),cpu.connectBus(bus),ppi.connectBus(bus),vdp.connectBus(bus),psg.setAudioSocket(audioSocket),psg.connectBus(bus),rtc.connectBus(bus),syf.connectBus(bus),trd.connectBus(bus)}function socketsCreate(){machineTypeSocket=new wmsx.MachineTypeSocket(self),videoClockSocket=new VideoClockSocket,videoSocket=new VideoSocket,slotSocket=new SlotSocket,biosSocket=new BIOSSocket,extensionsSocket=new wmsx.ExtensionsSocket(self),cartridgeSocket=new CartridgeSocket,expansionSocket=new ExpansionSocket,controllersSocket=new ControllersSocket,saveStateSocket=new SaveStateSocket,cassetteSocket=new CassetteSocket,audioSocket=new AudioSocket,diskDriveSocket=new DiskDriveSocket,machineControlsSocket=new MachineControlsSocket,ledsSocket=new LedsSocket}function computeBasicAutoRunCommandParameters(){basicAutoRunCommand=(WMSX.BASIC_ENTER?WMSX.BASIC_ENTER+"\r":"")+(WMSX.BASIC_TYPE||""),WMSX.BASIC_RUN?basicAutoRunCommand='\r\r\rRUN "'+WMSX.BASIC_RUN+'"\r'+basicAutoRunCommand:WMSX.BASIC_LOAD?basicAutoRunCommand='\r\r\rLOAD "'+WMSX.BASIC_LOAD+'"\r'+basicAutoRunCommand:WMSX.BASIC_BRUN?basicAutoRunCommand='\r\r\rBLOAD "'+WMSX.BASIC_BRUN+'",r\r'+basicAutoRunCommand:WMSX.BASIC_BLOAD&&(basicAutoRunCommand='\r\r\rBLOAD "'+WMSX.BASIC_BLOAD+'"\r'+basicAutoRunCommand)}function typeBasicAutoRunCommand(){diskDriveSocket.hasAnyMediaInserted()||cartridgeSocket.hasAnyMediaInserted()||cassetteSocket.typeAutoRunCommand(),basicAutoRunDone||(basicAutoRunCommand&&biosSocket.keyboardExtensionTypeString(basicAutoRunCommand),basicAutoRunDone=!0,basicAutoRunCommand=void 0)}function controlStateChanged(a,b,c,d){if(!isLoading){if(a===controls.FAST_SPEED&&!c)return void(b&&alternateSpeed!==SPEED_FAST?(alternateSpeed=SPEED_FAST,videoClockUpdateSpeed(),self.showOSD("FAST FORWARD",!0)):b||alternateSpeed!==SPEED_FAST||(alternateSpeed=null,videoClockUpdateSpeed(),self.showOSD(null,!0)));if(a===controls.FAST_SPEED&&c)return void(b&&alternateSpeed!==SPEED_SLOW?(alternateSpeed=SPEED_SLOW,videoClockUpdateSpeed(),self.showOSD("SLOW MOTION",!0)):b||alternateSpeed!==SPEED_SLOW||(alternateSpeed=null,videoClockUpdateSpeed(),self.showOSD(null,!0)));if(b)switch(a){case controls.POWER:c?self.powerIsOn&&self.reset():self.powerIsOn?self.powerOff():self.userPowerOn(!1);break;case controls.POWER_OFF:self.powerIsOn&&self.powerOff();break;case controls.PAUSE_CPU:var e=!trd.isCPUPaused();self.cpuPause(e,c);break;case controls.PAUSE:self.userPause(!userPaused,c),self.showOSD(userPaused?"EMULATION PAUSED"+(c?" with AUDIO ON":""):"EMULATION RESUMED",!0);break;case controls.FRAME:userPaused&&(userPauseMoreFrames=1);break;case controls.INC_SPEED:case controls.DEC_SPEED:case controls.NORMAL_SPEED:case controls.MIN_SPEED:var f=SPEEDS.indexOf(speedControl);return a===controls.INC_SPEED&&f0?--f:a===controls.MIN_SPEED?f=0:a===controls.NORMAL_SPEED&&(f=SPEEDS.indexOf(1)),speedControl=SPEEDS[f],self.showOSD("Speed: "+(100*speedControl|0)+"%",!0),void videoClockUpdateSpeed();case controls.SAVE_STATE_0:case controls.SAVE_STATE_1:case controls.SAVE_STATE_2:case controls.SAVE_STATE_3:case controls.SAVE_STATE_4:case controls.SAVE_STATE_5:case controls.SAVE_STATE_6:case controls.SAVE_STATE_7:case controls.SAVE_STATE_8:case controls.SAVE_STATE_9:case controls.SAVE_STATE_10:case controls.SAVE_STATE_11:case controls.SAVE_STATE_12:saveStateSocket.saveState(255&a);break;case controls.SAVE_STATE_FILE:saveStateSocket.saveStateFile();break;case controls.LOAD_STATE_0:case controls.LOAD_STATE_1:case controls.LOAD_STATE_2:case controls.LOAD_STATE_3:case controls.LOAD_STATE_4:case controls.LOAD_STATE_5:case controls.LOAD_STATE_6:case controls.LOAD_STATE_7:case controls.LOAD_STATE_8:case controls.LOAD_STATE_9:case controls.LOAD_STATE_10:case controls.LOAD_STATE_11:case controls.LOAD_STATE_12:saveStateSocket.loadState(255&a);break;case controls.TYPE_STRING:biosSocket.keyboardExtensionTypeString(d);break;case controls.VIDEO_STANDARD:videoStandardIsAuto?setVideoStandardForced(c?wmsx.VideoStandard.PAL:wmsx.VideoStandard.NTSC):videoStandard==wmsx.VideoStandard.NTSC?c?setVideoStandardAuto(!0):setVideoStandardForced(wmsx.VideoStandard.PAL):c?setVideoStandardForced(wmsx.VideoStandard.NTSC):setVideoStandardAuto(!0);break;case controls.VSYNCH:vSynchModeToggle();break;case controls.CPU_CLOCK_MODE:trd.isR800LedOn()?self.toggleR800ClockMode(c):self.toggleZ80ClockMode(c);break;case controls.Z80_CLOCK_MODE:self.toggleZ80ClockMode(c);break;case controls.R800_CLOCK_MODE:self.toggleR800ClockMode(c);break;case controls.VDP_CLOCK_MODE:self.toggleVDPClockMode(c);break;case controls.DEBUG:var g=vdp.toggleDebugModes(c);wmsx.DeviceMissing.setDebugMode(g);break;case controls.SPRITE_MODE:vdp.toggleSpriteDebugModes(c);break;case controls.DEFAULTS:self.setDefaults(),self.showOSD("Default Settings",!0)}}}function VideoClockSocket(){this.connectClock=function(b){a=b,rtc.syncTimeWithSource()},this.getVSynchNativeFrequency=function(){return a.getVSynchNativeFrequency()},this.setVSynch=function(b){a.setVSynch(b)},this.setFrequency=function(b,c){a.setFrequency(b,c)},this.isVSynchActive=function(){return a.isVSynchActive()},this.getRealTime=function(){return a.getRealTime()};var a}function BIOSSocket(){this.insertBIOS=function(a,b){slotSocket.insertSlot(a,WMSX.BIOS_SLOT,b)},this.insertBIOSEXT=function(a,b){slotSocket.insertSlot(a,WMSX.BIOSEXT_SLOT,b)},this.keyboardExtensionTypeString=function(a){bios&&bios.getKeyboardExtension().typeString(a)},this.keyboardExtensionCancelTypeString=function(){bios&&bios.getKeyboardExtension().cancelTypeString()},this.turboDriverTurboModesUpdate=function(){bios&&bios.getTurboDriver().turboModesUpdate()}}function ExpansionSocket(){this.insertExpansion=function(a,b,c){var d=b?WMSX.EXPANSION2_SLOT:WMSX.EXPANSION1_SLOT;a!==slotSocket.slotInserted(d)&&(slotSocket.insertSlot(a,d,c),cartridgeSocket.fireCartridgesStateUpdate(),self.showOSD("Expansion "+(1===b?"2":"1")+" (slot "+getSlotDesc(d)+"): "+(a?a.rom.source:"EMPTY"),!0))},this.expansionInserted=function(a){return slotSocket.slotInserted(a?WMSX.EXPANSION2_SLOT:WMSX.EXPANSION1_SLOT)}}function CartridgeSocket(){this.insertCartridge=function(a,b,c,d){var e=1===b?WMSX.CARTRIDGE2_SLOT:WMSX.CARTRIDGE1_SLOT;slotSocket.insertSlot(a,e,c,!0),this.fireCartridgesStateUpdate(),d||self.showOSD("Cartridge "+(1===b?"2":"1")+": "+(a?a.rom.source:"EMPTY"),!0)},this.removeCartridge=function(a,b){var c=1===a?WMSX.CARTRIDGE2_SLOT:WMSX.CARTRIDGE1_SLOT;return null===slotSocket.slotInserted(c)?(self.showOSD("No Cartridge in Slot "+(1===a?"2":"1"),!0,!0),!1):(slotSocket.insertSlot(null,c,b,!0),this.fireCartridgesStateUpdate(),self.showOSD("Cartridge "+(1===a?"2":"1")+" removed",!0),!0)},this.cartridgeInserted=function(a){return slotSocket.slotInserted(1===a?WMSX.CARTRIDGE2_SLOT:WMSX.CARTRIDGE1_SLOT)},this.dataOperationNotSupportedMessage=function(a,b,c){var d=1===a?WMSX.CARTRIDGE2_SLOT:WMSX.CARTRIDGE1_SLOT,e=slotSocket.slotInserted(d);return null===e?(c||self.showOSD("No Cartridge in Slot "+(1===a?"2":"1"),!0,!0),!0):!e.getDataDesc()&&(c||self.showOSD("Data "+(b?"Saving":"Loading")+" not supported for Cartridge "+(1===a?"2":"1"),!0,!0),!0)},this.loadCartridgeData=function(a,b,c){var d=1===a?WMSX.CARTRIDGE2_SLOT:WMSX.CARTRIDGE1_SLOT,e=slotSocket.slotInserted(d);if(e&&e.loadData(wmsx.Util.leafFilename(b),c))return self.showOSD(e.getDataDesc()+" loaded in Cartridge "+(1===a?"2":"1"),!0),c},this.getCartridgeData=function(a){if(!this.dataOperationNotSupportedMessage(a,!0,!1)){return slotSocket.slotInserted(1===a?WMSX.CARTRIDGE2_SLOT:WMSX.CARTRIDGE1_SLOT).getDataToSave()}},this.fireCartridgesStateUpdate=function(){for(var a=0;a=0;d--)a.connectAudioSignal(c[d])},this.connectAudioSignal=function(d){c.indexOf(d)>=0||(wmsx.Util.arrayAdd(c,d),this.flushAllSignals(),d.setFps(b),a&&a.connectAudioSignal(d))},this.disconnectAudioSignal=function(b){wmsx.Util.arrayRemoveAllElement(c,b),a&&a.disconnectAudioSignal(b)},this.audioClockPulse32=function(){for(var a=c.length-1;a>=0;--a)c[a].audioClockPulse()},this.audioFinishFrame=function(){for(var a=c.length-1;a>=0;--a)c[a].audioFinishFrame()},this.muteAudio=function(){a&&a.mute()},this.unMuteAudio=function(){a&&a.unMute()},this.setFps=function(a){b=a;for(var d=c.length-1;d>=0;--d)c[d].setFps(b)},this.pauseAudio=function(){a&&a.pauseAudio()},this.unpauseAudio=function(){a&&a.unpauseAudio()},this.flushAllSignals=function(){for(var a=c.length-1;a>=0;--a)c[a].flush()},this.getBUSCycles=function(){return cpu.getBUSCycles()};var a,b,c=[]}function CassetteSocket(){this.connectDeck=function(b){a=b},this.connectDriver=function(a){b=a},this.getDeck=function(){return a},this.getDriver=function(){return b},this.autoPowerCycle=function(a){b&&b.currentAutoRunCommand()&&(self.powerIsOn||a||self.userPowerOn(!0))},this.typeAutoRunCommand=function(){b&&b.typeCurrentAutoRunCommand()},this.saveState=function(){return a.saveState()},this.loadState=function(b){a.loadState(b)};var a,b}function DiskDriveSocket(){this.connectDrive=function(a){b=a},this.getDrive=function(){return b},this.autoPowerCycle=function(a){self.powerIsOn||a||self.userPowerOn(!1)},this.diskInterfaceConnected=function(a){c.add(a),this.fireInterfacesChangeUpdate()},this.diskInterfaceDisconnected=function(a){c.delete(a),this.fireInterfacesChangeUpdate()},this.hardDiskInterfaceConnected=function(a){d.add(a),this.fireInterfacesChangeUpdate()},this.hardDiskInterfaceDisconnected=function(a){d.delete(a),this.fireInterfacesChangeUpdate()},this.dos2ROMConnected=function(a){e.add(a)},this.dos2ROMDisconnected=function(a){e.delete(a)},this.hasDiskInterface=function(){return c.size>0},this.hasHardDiskInterface=function(){return d.size>0},this.hasDOS2=function(){return e.size>0||d.size>0},this.setInterfacesChangeListener=function(b){a=b,this.fireInterfacesChangeUpdate()},this.fireInterfacesChangeUpdate=function(){a&&a.diskInterfacesStateUpdate(this.hasDiskInterface(),this.hasHardDiskInterface())},this.hasAnyMediaInserted=function(){return this.getDrive().hasAnyMediaInserted()},this.saveState=function(){return b.saveState()},this.loadState=function(a){b.loadState(a)};var a,b,c=new Set,d=new Set,e=new Set}function ControllersSocket(){this.connectControls=function(b){a=b},this.readKeyboardPort=function(b){return a.readKeyboardPort(b)},this.readControllerPort=function(b){return a.readControllerPort(b)},this.writeControllerPin8Port=function(b,c){a.writeControllerPin8Port(b,c)},this.releaseControllers=function(){a.releaseControllers()},this.resetControllers=function(){a.resetControllers()},this.getBUSCycles=function(){return cpu.getBUSCycles()},this.saveState=function(){return a.saveState()},this.loadState=function(b){a.loadState(b)};var a}function MachineControlsSocket(){this.controlStateChanged=function(a,b,c,d){controlStateChanged(a,b,c,d)},this.addPowerAndUserPauseStateListener=function(b){a.indexOf(b)>=0||(a.push(b),this.firePowerAndUserPauseStateUpdate())},this.firePowerAndUserPauseStateUpdate=function(){for(var b=0;b0&&(a?fastBootCountdown>0&&(alternateSpeed=null,videoClockUpdateSpeed()):(fastBootCountdown=fastBootFrames,alternateSpeed=SPEED_FAST,videoClockUpdateSpeed()))},this.userPowerOn=function(a){if(!isLoading){if(!bios)return void this.showOSD("Insert BIOS!",!0,!0);this.powerOn(),a&&typeBasicAutoRunCommand()}},this.videoClockPulse=function(){fastBootCountdown>0&&--fastBootCountdown<=0&&(alternateSpeed=null,videoClockUpdateSpeed()),rtc.videoClockPulse(),bios&&bios.getKeyboardExtension().keyboardExtensionClockPulse(),self.powerIsOn&&(userPaused&&userPauseMoreFrames--<=0||(vdp.videoClockPulse(),audioSocket.audioFinishFrame()))},this.getMachineTypeSocket=function(){return machineTypeSocket},this.getVideoClockSocket=function(){return videoClockSocket},this.getSlotSocket=function(){return slotSocket},this.getBIOSSocket=function(){return biosSocket},this.getExtensionsSocket=function(){return extensionsSocket},this.getExpansionSocket=function(){return expansionSocket},this.getCartridgeSocket=function(){return cartridgeSocket},this.getMachineControlsSocket=function(){return machineControlsSocket},this.getControllersSocket=function(){return controllersSocket},this.getVideoSocket=function(){return videoSocket},this.getAudioSocket=function(){return audioSocket},this.getSavestateSocket=function(){return saveStateSocket},this.getCassetteSocket=function(){return cassetteSocket},this.getDiskDriveSocket=function(){return diskDriveSocket},this.getLedsSocket=function(){return ledsSocket},this.showOSD=function(a,b,c){videoSocket.getMonitor().showOSD(a,b,c)},this.setVideoStandardSoft=function(a){videoStandardSoft=a,videoStandardIsAuto&&videoStandard!==a?setVideoStandard(a,!1,!0):videoStandardIsAuto||videoStandard===a||self.showOSD("Cannot soft-change Video Standard. It's FORCED: "+videoStandard.desc,!0,!0)},this.setBIOS=function(a){bios=a===EMPTY_SLOT?null:a,videoStandardSoft=null,setVideoStandardAuto()},this.setLoading=function(a){isLoading=a},this.userPause=function(a,b){var c=userPaused;return userPaused!==a&&(userPaused=!!a,userPauseMoreFrames=-1,userPaused?b||audioSocket.muteAudio():audioSocket.unMuteAudio(),machineControlsSocket.firePowerAndUserPauseStateUpdate()),c},this.systemPause=function(a){var b=systemPaused;return systemPaused!==a&&(systemPaused=!!a,systemPaused?audioSocket.pauseAudio():trd.isCPUPaused()||audioSocket.unpauseAudio()),b},this.isSystemPaused=function(){return systemPaused},this.cpuPause=function(a,b,c){a!==trd.isCPUPaused()&&(trd.setCPUPause(a,c),a?b||audioSocket.pauseAudio():systemPaused||audioSocket.unpauseAudio())},this.vSynchSetSupported=function(a){var b=WMSX.userPreferences.current.vSynch;setVSynchMode(-1!==WMSX.SCREEN_VSYNC_MODE&&a?WMSX.SCREEN_VSYNC_MODE>=0?WMSX.SCREEN_VSYNC_MODE:null!==b&&b>=0?b:1:-1,!0)},this.toggleZ80ClockMode=function(a){a?this.setZ80ClockMode(z80ClockMode<=0?8:z80ClockMode<=1?0:z80ClockMode<=1.5?1:z80ClockMode<=2?1.5:(0|z80ClockMode)-1):this.setZ80ClockMode(z80ClockMode>=8?0:z80ClockMode<1?1:z80ClockMode<1.5?1.5:z80ClockMode<2?2:1+(0|z80ClockMode)),this.showZ80ClockModeMessage()},this.setZ80ClockMode=function(a){z80ClockMode=a<0||a>8?0:a,biosSocket.turboDriverTurboModesUpdate()},this.getZ80ClockMode=function(){return z80ClockMode},this.showZ80ClockModeMessage=function(){self.showOSD("Z80 Clock: "+this.getZ80ClockModeDesc(),!0)},this.getZ80ClockModeDesc=function(){var a=0===z80ClockMode?"Auto ":1===z80ClockMode?"Normal ":"",b=cpu.getZ80ClockMulti();return a+=(0!==z80ClockMode&&1!==z80ClockMode?b+"x ":"")+"("+cpu.getClockFreqDesc(b)+")"},this.toggleR800ClockMode=function(a){a?this.setR800ClockMode(r800ClockMode<=0?2:r800ClockMode<=.5?0:Math.max(((4*r800ClockMode|0)-1)/4,.5)):this.setR800ClockMode(r800ClockMode>=2?0:Math.max((1+(4*r800ClockMode|0))/4,.5)),this.showR800ClockModeMessage()},this.setR800ClockMode=function(a){r800ClockMode=a<0||a>2?0:a,biosSocket.turboDriverTurboModesUpdate()},this.getR800ClockMode=function(){return r800ClockMode},this.showR800ClockModeMessage=function(){self.showOSD("R800 Clock: "+this.getR800ClockModeDesc(),!0)},this.getR800ClockModeDesc=function(){var a=0===r800ClockMode?"Auto ":1===r800ClockMode?"Normal ":"",b=cpu.getR800ClockMulti();return a+=(0!==r800ClockMode&&1!==r800ClockMode?b+"x ":"")+"("+cpu.getClockFreqDesc(2*b)+")"},this.toggleVDPClockMode=function(a){a?this.setVDPClockMode(vdpClockMode<=0?9:vdpClockMode<=1?0:(0|vdpClockMode)-1):this.setVDPClockMode(1+(0|vdpClockMode)),self.showOSD("VDP Engine Clock: "+this.getVDPClockModeDesc(),!0)},this.setVDPClockMode=function(a){vdpClockMode=a<0||a>9?0:a,biosSocket.turboDriverTurboModesUpdate()},this.getVDPClockMode=function(){return vdpClockMode},this.getVDPClockModeDesc=function(){var a=0===vdpClockMode?"Auto ":1===vdpClockMode?"Normal ":9===vdpClockMode?"Instant":"",b=vdp.getVDPTurboMulti();return a+=b>0&&1!==b&&b<9?b+"x ":""},this.setDefaults=function(){setVideoStandardAuto(!1),vdp.setDefaults(),speedControl=defaultSpeed,alternateSpeed=null,videoClockUpdateSpeed()},this.saveState=saveState,this.loadState=loadState,this.machineName=null,this.machineType=0,this.powerIsOn=!1;var speedControl=1,alternateSpeed=!1,defaultSpeed=WMSX.SPEED>0?WMSX.SPEED/100:1,isLoading=!1,basicAutoRunDone=!1,basicAutoRunCommand,cpu,bus,ppi,vdp,psg,rtc,syf,trd,userPaused=!1,userPauseMoreFrames=0,systemPaused=!1,cpuPaused=!1,machineTypeSocket,videoClockSocket,videoSocket,slotSocket,biosSocket,extensionsSocket,expansionSocket,cartridgeSocket,saveStateSocket,cassetteSocket,diskDriveSocket,machineControlsSocket,controllersSocket,audioSocket,ledsSocket,bios,videoStandard,videoStandardSoft,videoStandardIsAuto=!1,vSynchMode,fastBootFrames=WMSX.FAST_BOOT<=0?0:WMSX.FAST_BOOT>1?WMSX.FAST_BOOT:WMSX.BOOT_KEYS_FRAMES>0?WMSX.BOOT_KEYS_FRAMES:WMSX.BOOT_DURATION_AUTO,fastBootCountdown=0,z80ClockMode=WMSX.Z80_CLOCK_MODE<0?0:WMSX.Z80_CLOCK_MODE,r800ClockMode=WMSX.R800_CLOCK_MODE<0?0:WMSX.R800_CLOCK_MODE,vdpClockMode=WMSX.VDP_CLOCK_MODE<0?0:WMSX.VDP_CLOCK_MODE,EMPTY_SLOT=wmsx.SlotEmpty.singleton,SPEEDS=[.05,.1,.2,.3,.4,.5,.6,.7,.8,.9,1,1.1,1.25,1.5,2,3,5,10],SPEED_FAST=10,SPEED_SLOW=.3,controls=wmsx.MachineControls;this.eval=function(str){return eval(str)},init()},wmsx.Machine.BASE_CPU_CLOCK=3584160,wmsx.Machine.MACHINE_TYPE={MSX1:1,MSX2:2,MSX2P:3,MSXTR:4},wmsx.KeyboardKeys={D0:{m:[0,0],key:"D0",c_en:"0",cs_en:")",cs_ja:" "},D1:{m:[0,1],key:"D1",c_en:"1",cs_en:"!"},D2:{m:[0,2],key:"D2",c_en:"2",cs_en:"@",cs_ja:'"'},D3:{m:[0,3],key:"D3",c_en:"3",cs_en:"#"},D4:{m:[0,4],key:"D4",c_en:"4",cs_en:"$"},D5:{m:[0,5],key:"D5",c_en:"5",cs_en:"%"},D6:{m:[0,6],key:"D6",c_en:"6",cs_en:"^",cs_ja:"&"},D7:{m:[0,7],key:"D7",c_en:"7",cs_en:"&",cs_ja:"'"},D8:{m:[1,0],key:"D8",c_en:"8",cs_en:"*",cs_ja:"("},D9:{m:[1,1],key:"D9",c_en:"9",cs_en:"(",cs_ja:")"}, MINUS:{m:[1,2],key:"MINUS",c_en:"-",cs_en:"_",cs_ja:"="},EQUAL:{m:[1,3],key:"EQUAL",c_en:"=",cs_en:"+",c_ja:"^",cs_ja:"~"},BACKSLASH:{m:[1,4],key:"BACKSLASH",c_en:"\\",cs_en:"|",c_ja:"¥",cs_ja:"|"},OPEN_BRACKET:{m:[1,5],key:"OPEN_BRACKET",c_en:"[",cs_en:"{",c_ja:"@",cs_ja:"`"},CLOSE_BRACKET:{m:[1,6],key:"CLOSE_BRACKET",c_en:"]",cs_en:"}",c_ja:"[",cs_ja:"{"},SEMICOLON:{m:[1,7],key:"SEMICOLON",c_en:";",cs_en:":",cs_ja:"+"},QUOTE:{m:[2,0],key:"QUOTE",c_en:"'",cs_en:'"',c_ja:":",cs_ja:"*"},BACKQUOTE:{m:[2,1],key:"BACKQUOTE",c_en:"`",cs_en:"~",c_ja:"]",cs_ja:"}"},COMMA:{m:[2,2],key:"COMMA",c_en:",",cs_en:"<"},PERIOD:{m:[2,3],key:"PERIOD",c_en:".",cs_en:">"},SLASH:{m:[2,4],key:"SLASH",c_en:"/",cs_en:"?"},DEAD:{m:[2,5],key:"DEAD",c_en:"à",cs_en:"á",c_ja:" ",cs_ja:"_",cns_en:"à",cns_ja:"_"},A:{m:[2,6],key:"A",c_en:"A"},B:{m:[2,7],key:"B",c_en:"B"},C:{m:[3,0],key:"C",c_en:"C"},D:{m:[3,1],key:"D",c_en:"D"},E:{m:[3,2],key:"E",c_en:"E"},F:{m:[3,3],key:"F",c_en:"F"},G:{m:[3,4],key:"G",c_en:"G"},H:{m:[3,5],key:"H",c_en:"H"},I:{m:[3,6],key:"I",c_en:"I"},J:{m:[3,7],key:"J",c_en:"J"},K:{m:[4,0],key:"K",c_en:"K"},L:{m:[4,1],key:"L",c_en:"L"},M:{m:[4,2],key:"M",c_en:"M"},N:{m:[4,3],key:"N",c_en:"N"},O:{m:[4,4],key:"O",c_en:"O"},P:{m:[4,5],key:"P",c_en:"P"},Q:{m:[4,6],key:"Q",c_en:"Q"},R:{m:[4,7],key:"R",c_en:"R"},S:{m:[5,0],key:"S",c_en:"S"},T:{m:[5,1],key:"T",c_en:"T"},U:{m:[5,2],key:"U",c_en:"U"},V:{m:[5,3],key:"V",c_en:"V"},W:{m:[5,4],key:"W",c_en:"W"},X:{m:[5,5],key:"X",c_en:"X"},Y:{m:[5,6],key:"Y",c_en:"Y"},Z:{m:[5,7],key:"Z",c_en:"Z"},SHIFT:{m:[6,0],key:"SHIFT",c_en:"SHF"},CONTROL:{m:[6,1],key:"CONTROL",c_en:"CTR"},CAPSLOCK:{m:[6,3],key:"CAPSLOCK",c_en:"CAP"},GRAPH:{m:[6,2],key:"GRAPH",c_en:"GRA"},CODE:{m:[6,4],key:"CODE",c_en:"COD",c_ja:"KANA",cs_ja:"KANA"},F1:{m:[6,5],key:"F1",c_en:"F1",cs_en:"F6"},F2:{m:[6,6],key:"F2",c_en:"F2",cs_en:"F7"},F3:{m:[6,7],key:"F3",c_en:"F3",cs_en:"F8"},F4:{m:[7,0],key:"F4",c_en:"F4",cs_en:"F9"},F5:{m:[7,1],key:"F5",c_en:"F5",cs_en:"F10"},ESCAPE:{m:[7,2],key:"ESCAPE",c_en:"ESC"},TAB:{m:[7,3],key:"TAB",c_en:"TAB"},STOP:{m:[7,4],key:"STOP",c_en:"STP"},BACKSPACE:{m:[7,5],key:"BACKSPACE",c_en:"BS"},SELECT:{m:[7,6],key:"SELECT",c_en:"SEL"},ENTER:{m:[7,7],key:"ENTER",c_en:"RET"},SPACE:{m:[8,0],key:"SPACE",c_en:"SPC"},HOME:{m:[8,1],key:"HOME",c_en:"HOM"},INSERT:{m:[8,2],key:"INSERT",c_en:"INS"},DELETE:{m:[8,3],key:"DELETE",c_en:"DEL"},LEFT:{m:[8,4],key:"LEFT",c_en:"LFT"},UP:{m:[8,5],key:"UP",c_en:"UP"},DOWN:{m:[8,6],key:"DOWN",c_en:"DWN"},RIGHT:{m:[8,7],key:"RIGHT",c_en:"RGH"},NUM_MULTIPLY:{m:[9,0],key:"NUM_MULTIPLY",c_en:"*"},NUM_PLUS:{m:[9,1],key:"NUM_PLUS",c_en:"+"},NUM_DIVIDE:{m:[9,2],key:"NUM_DIVIDE",c_en:"/"},NUM_0:{m:[9,3],key:"NUM_0",c_en:"0"},NUM_1:{m:[9,4],key:"NUM_1",c_en:"1"},NUM_2:{m:[9,5],key:"NUM_2",c_en:"2"},NUM_3:{m:[9,6],key:"NUM_3",c_en:"3"},NUM_4:{m:[9,7],key:"NUM_4",c_en:"4"},NUM_5:{m:[10,0],key:"NUM_5",c_en:"5"},NUM_6:{m:[10,1],key:"NUM_6",c_en:"6"},NUM_7:{m:[10,2],key:"NUM_7",c_en:"7"},NUM_8:{m:[10,3],key:"NUM_8",c_en:"8"},NUM_9:{m:[10,4],key:"NUM_9",c_en:"9"},NUM_MINUS:{m:[10,5],key:"NUM_MINUS",c_en:"-"},NUM_COMMA:{m:[10,6],key:"NUM_COMMA",c_en:","},NUM_PERIOD:{m:[10,7],key:"NUM_PERIOD",c_en:"."},YES:{m:[11,1],key:"YES",c_en:"YES",c_ja:"HAI",cs_ja:"HAI"},NO:{m:[11,3],key:"NO",c_en:"NO",c_ja:"IIE",cs_ja:"IIE"}},wmsx.JoystickButtons={J_UP:{button:"J_UP",mask:1,n:"UP"},J_DOWN:{button:"J_DOWN",mask:2,n:"DOWN"},J_LEFT:{button:"J_LEFT",mask:4,n:"LEFT"},J_RIGHT:{button:"J_RIGHT",mask:8,n:"RIGHT"},J_A:{button:"J_A",mask:16,n:"A"},J_B:{button:"J_B",mask:32,n:"B"},J_AB:{button:"J_AB",mask:48,n:"AB"},J_X:{button:"J_X",n:"X"},J_Y:{button:"J_Y",n:"Y"},J_L:{button:"J_L",n:"L"},J_R:{button:"J_R",n:"R"},J_BACK:{button:"J_BACK",n:"BACK"},J_START:{button:"J_START",n:"START"}},wmsx.MachineControls={POWER:51,POWER_OFF:53,DEBUG:101,TRACE:102,PAUSE:103,PAUSE_CPU:104,FRAME:105,FAST_SPEED:111,INC_SPEED:113,DEC_SPEED:114,NORMAL_SPEED:115,MIN_SPEED:116,SPRITE_MODE:121,VIDEO_STANDARD:123,VSYNCH:124,CPU_CLOCK_MODE:125,Z80_CLOCK_MODE:126,R800_CLOCK_MODE:127,VDP_CLOCK_MODE:128,DEFAULTS:130,SAVE_STATE_0:256,SAVE_STATE_1:257,SAVE_STATE_2:258,SAVE_STATE_3:259,SAVE_STATE_4:260,SAVE_STATE_5:261,SAVE_STATE_6:262,SAVE_STATE_7:263,SAVE_STATE_8:264,SAVE_STATE_9:265,SAVE_STATE_10:266,SAVE_STATE_11:267,SAVE_STATE_12:268,LOAD_STATE_0:512,LOAD_STATE_1:513,LOAD_STATE_2:514,LOAD_STATE_3:515,LOAD_STATE_4:516,LOAD_STATE_5:517,LOAD_STATE_6:518,LOAD_STATE_7:519,LOAD_STATE_8:520,LOAD_STATE_9:521,LOAD_STATE_10:522,LOAD_STATE_11:523,LOAD_STATE_12:524,SAVE_STATE_FILE:201,TYPE_STRING:301},wmsx.Images={embedded:!1,count:5,urls:{logo:WMSX.IMAGES_PATH+"logo.png",sprites:WMSX.IMAGES_PATH+"sprites.png",loading:WMSX.IMAGES_PATH+"loading.gif",mouseCursor:WMSX.IMAGES_PATH+"mouse-cursor.png",logoMiniBrightBack:WMSX.IMAGES_PATH+"logo-mini-bright-back.png"}},WMSX.userPreferences={},WMSX.userPreferences.currentVersion=60,WMSX.userPreferences.compatibleVersions=new Set([60,50]),WMSX.userPreferences.defaults=function(){"use strict";var a=wmsx.KeyboardKeys,b=wmsx.JoystickButtons,c=wmsx.DOMKeys,d=wmsx.GamepadButtons;return{hostKeyboard:{en:void 0,ja:void 0},customHostKeyboards:{en:{},ja:{}},customHostKeys:{nextCode:1001,keys:[]},joysticks:[{buttons:{J_UP:[d.GB_UP],J_DOWN:[d.GB_DOWN],J_LEFT:[d.GB_LEFT],J_RIGHT:[d.GB_RIGHT],J_A:[d.GB_1,d.GB_3],J_B:[d.GB_2,d.GB_3],J_X:[],J_Y:[],J_L:[d.GB_L1,d.GB_L2],J_R:[d.GB_R1,d.GB_R2],J_BACK:[d.GB_BACK],J_START:[d.GB_START]},virtualButtonsKeys:{J_X:[],J_Y:[],J_L:[{wc:c.VK_F12.wc|c.SHIFT,n:["Shift","F12"]}],J_R:[c.VK_F12],J_BACK:[c.VK_ESCAPE],J_START:[{wc:c.VK_P.wc|c.ALT,n:["Alt","P"]}]},settings:{device:-1,xAxis:0,xAxisSig:1,yAxis:1,yAxisSig:1,deadzone:.3}},{buttons:{J_UP:[d.GB_UP],J_DOWN:[d.GB_DOWN],J_LEFT:[d.GB_LEFT],J_RIGHT:[d.GB_RIGHT],J_A:[d.GB_1,d.GB_3],J_B:[d.GB_2,d.GB_3],J_X:[],J_Y:[],J_L:[d.GB_L1,d.GB_L2],J_R:[d.GB_R1,d.GB_R2],J_BACK:[d.GB_BACK],J_START:[d.GB_START]},virtualButtonsKeys:{J_X:[],J_Y:[],J_L:[{wc:c.VK_F12.wc|c.SHIFT,n:["Shift","F12"]}],J_R:[c.VK_F12],J_BACK:[c.VK_ESCAPE],J_START:[{wc:c.VK_P.wc|c.ALT,n:["Alt","P"]}]},settings:{device:-1,xAxis:0,xAxisSig:1,yAxis:1,yAxisSig:1,deadzone:.3}}],joykeys:[{buttons:{J_UP:[c.VK_UP],J_DOWN:[c.VK_DOWN],J_LEFT:[c.VK_LEFT],J_RIGHT:[c.VK_RIGHT],J_A:[c.VK_SPACE,c.VK_LSHIFT,c.VK_INSERT],J_B:[c.VK_M,c.VK_LCONTROL,c.VK_DELETE]}},{buttons:{J_UP:[c.VK_T],J_DOWN:[c.VK_G],J_LEFT:[c.VK_F],J_RIGHT:[c.VK_H],J_A:[c.VK_A],J_B:[c.VK_Z]}}],touch:{directional:"JOYSTICK",directionalBig:!1,mirrored:!1,buttons:{T_A:b.J_A,T_B:b.J_B,T_C:b.J_AB,T_D:a.ESCAPE,T_E:a.SPACE,T_F:a.F1,T_G:a.ENTER,T_X:null,T_Y:null}},vSynch:1,crtFilter:-1,crtScanlines:0,hapticFeedback:!0,audioBufferBase:-1,netPlaySessionName:"",netPlayNick:"",syncTimeLoadState:!1}},WMSX.userPreferences.load=function(){var a;try{a=JSON.parse(localStorage["wmsxprefs"+this.getEnvSuffix()]||"{}"),a.version&&delete a.version}catch(a){}if(!a||!WMSX.userPreferences.compatibleVersions.has(a.prefsVersion)){a={}}var b=WMSX.userPreferences.defaults();for(var c in b)void 0===a[c]&&(a[c]=b[c]);a.prefsVersion=WMSX.userPreferences.currentVersion,WMSX.userPreferences.current=a,wmsx.DOMKeys.initPreferences()},WMSX.userPreferences.save=function(){if(WMSX.userPreferences.isDirty)try{WMSX.userPreferences.current.wmsxVersion=WMSX.VERSION,localStorage["wmsxprefs"+this.getEnvSuffix()]=JSON.stringify(WMSX.userPreferences.current),delete WMSX.userPreferences.isDirty,wmsx.Util.log("Preferences saved!")}catch(a){}},WMSX.userPreferences.getEnvSuffix=function(){return void 0===this.envSuffix&&(this.envSuffix=WMSX.ENVIRONMENT?"_"+WMSX.ENVIRONMENT:""),this.envSuffix},WMSX.userPreferences.setDirty=function(){WMSX.userPreferences.isDirty=!0},WMSX.userROMFormats={init:function(){wmsx.SlotCreator.setUserROMFormats(this),this.userFormats=JSON.parse(localStorage.wmsxuserformats||"{}")},getForROM:function(a){return this.userFormats[a.info.h]},setForROM:function(a,b,c){ a.info.h&&(c?delete this.userFormats[a.info.h]:this.userFormats[a.info.h]=b,localStorage.wmsxuserformats=JSON.stringify(this.userFormats))}},wmsx.Clock=function(clockPulse){"use strict";this.connect=function(a){a.connectClock(this)},this.go=function(){running||(useRequestAnimationFrame=vSynch&&cyclesPerSecond===this.getVSynchNativeFrequency(),running=!0,useRequestAnimationFrame?animationFrame=requestAnimationFrame(pulse):interval=setInterval(pulse,cycleTimeMs))},this.pause=function(){running=!1,animationFrame&&(cancelAnimationFrame(animationFrame),animationFrame=null),interval&&(clearInterval(interval),interval=null)},this.setFrequency=function(a,b){running?(this.pause(),internalSetFrequency(a,b),this.go()):internalSetFrequency(a,b)},this.setVSynch=function(a){running?(this.pause(),vSynch=a,this.go()):vSynch=a},this.getVSynchNativeFrequency=function(){return vSynchAltNativeFrequency||vSynchNativeFrequency},this.setVSynchAltNativeFrequency=function(a){vSynchAltNativeFrequency=a},this.isVSynchActive=function(){return useRequestAnimationFrame},this.getRealTime=function(){return Date.now()-60*(new Date).getTimezoneOffset()*1e3};var internalSetFrequency=function(a,b){cyclesPerSecond=a,cycleTimeMs=1e3/a,divider=b>=1?b:1,dividerCounter>divider&&(dividerCounter=divider)},pulse=function(){animationFrame=null,divider>1?--dividerCounter<=0&&(dividerCounter=divider,clockPulse()):clockPulse(),useRequestAnimationFrame&&!animationFrame&&(animationFrame=requestAnimationFrame(pulse))};this.detectHostNativeFPSAndCallback=function(a){function b(){vSynchNativeFrequency=-1,wmsx.Util.error("Could not detect video native frequency. VSync DISABLED!"),a&&a(vSynchNativeFrequency)}if(-1===WMSX.SCREEN_VSYNC_MODE)return wmsx.Util.warning("Video native VSync disabled in configuration"),void(a&&a(vSynchNativeFrequency));if(-1!==WMSX.SCREEN_FORCE_HOST_NATIVE_FPS)return wmsx.Util.warning("Host video frequency forced in configuration: "+WMSX.SCREEN_FORCE_HOST_NATIVE_FPS),void(a&&a(vSynchNativeFrequency));if(!window.requestAnimationFrame)return b();var c=0,d=0,e=0,f=0,g=0,h=0,i=function(){if(e>=12||f>=18||g>=14||h>=18)return vSynchNativeFrequency=e>=12?60:f>=18?50:g>=14?120:100,wmsx.Util.log("Video native frequency detected: "+vSynchNativeFrequency+"Hz"),void(a&&a(vSynchNativeFrequency));if(!(++c<=70))return b();var j=wmsx.Util.performanceNow(),k=1e3/(j-d);d=j,k>=47&&k<=53&&f++,k>=56.4&&k<=63.6&&e++,k>=112.8&&k<=127.2&&g++,k>=94&&k<=106&&h++,requestAnimationFrame(i)};i()},this.eval=function(str){return eval(str)};var running=!1,cyclesPerSecond=1,cycleTimeMs=1e3,divider=1,dividerCounter=1,useRequestAnimationFrame,animationFrame=null,interval=null,vSynch=!0,vSynchNativeFrequency=-1===WMSX.SCREEN_VSYNC_MODE?-1:WMSX.SCREEN_FORCE_HOST_NATIVE_FPS,vSynchAltNativeFrequency=void 0},wmsx.FileLoader=function(a){"use strict";function b(a,b,c,d,e){return z.loadAsDiskFromFiles(c,a,p.createTreeFromZip(b),d,e)}function c(a,b,c,d){return z.loadAsDiskFromFiles(b,null,a,c,d)}function d(a,b,c,d,f,g,h){if((b===P.DISK||b===P.AUTO)&&z.loadDiskStackFromFiles(c,a,d,f,h))return!0;if(b!==P.DISK)for(var i=0;i0&&(1===b.length?p.readFromFile(b[0],C,G,H,I,d):p.readFromFiles(b,C,G,H,I,d)),!1}}function i(a){if(a.returnValue=!1,a.preventDefault(),a.stopPropagation(),!J&&a.dataTransfer){var b=(a.shiftKey?L:0)|(a.ctrlKey?M:0)|(a.altKey?N:0)|(a.buttons&K?O:0);j(a.target,b),a.dataTransfer.dropEffect=!D||D.disabled?"none":"link",F&&clearTimeout(F),F=setTimeout(k,250)}}function j(a,b){if(a&&w.mediaChangeDisabledWarning())a=void 0;else for(;a&&!a.wmsxDropInfo;)a=a.parentElement;if(a){var c=a.wmsxDropInfo;c.subFiles&&b&N?c=c.subFiles:c.subAdd&&b&M&&(c=c.subAdd)}if(D!==c||E!==b){if(D!==c){if(D){D.element.classList.remove("wmsx-selected");var d=D.mainEle;d&&d.classList.remove("wmsx-selected")}D=c,D&&(D.element.classList.add("wmsx-selected"),(d=D.mainEle)&&d.classList.add("wmsx-selected"))}E=b;var e;D&&(e=b&L&&D.mesSec?D.mesSec:D.mes,D.files&&b&M&&(e+=" (do not expand ZIP contents)"),b&O&&(e+=" - no Reset")),v.setFileLoaderDragMessage(e)}}function k(){j(void 0,0),F=void 0}function l(a){if(a.returnValue=!1,a.preventDefault(),a.target.focus(),J||!D||D.disabled||!a.dataTransfer)return k();var b=D,c=E;k();var d=c&O,e=b.files||c&N,f=b.add||c&M,g=void 0!==b.port?b.port:c&L?-1:void 0,h=b.openType;!e||h!==P.DISK&&h!==P.AUTO||(h=f?P.FILES_AS_DISK:P.AUTO_AS_DISK);var i=a.dataTransfer&&a.dataTransfer.files,j=q.systemPause(!0),l=function(a){j||q.systemPause(!1)};if(i&&i.length>0)1===i.length?p.readFromFile(i[0],h,g,d,f,l):p.readFromFiles(i,h,g,d,f,l);else{var m=a.dataTransfer.getData("text");m&&m.length>0?p.readFromURL(m,h,g,d,f,l):l()}}function m(a){if(!a||!a.trim())return a;var b=a.lastIndexOf(".");return(b>0?a.substring(0,b):a).trim()}function n(a){wmsx.Util.message("Could not load file(s):\n\n"+a+"\n")}function o(){A=document.createElement("input"),A.id="wmsx-file-loader-input",A.type="file",A.multiple=!0,A.accept=Q.AUTO,A.style.display="none",A.addEventListener("change",h),B.appendChild(A)}var p=this;this.connect=function(a){q=a,r=q.getSlotSocket(),s=q.getBIOSSocket(),q.getExtensionsSocket().connectFileLoader(this),t=q.getExpansionSocket(),u=q.getSavestateSocket()},this.connectPeripherals=function(a,b,c,d,e){v=a,w=b,x=c,y=d,z=e},this.registerForDnD=function(a){a.addEventListener("dragover",i,!1),a.addEventListener("drop",l,!1)},this.registerForDnDReject=function(a){a.addEventListener("dragover",function(a){a.returnValue=!1,a.preventDefault(),a.stopPropagation(),a.dataTransfer&&(a.dataTransfer.dropEffect="none")},!1)},this.registerForFileInputElement=function(a){B=a},this.openFileChooserDialog=function(a,b,c,d){A||o(),A.multiple=R[P[a]||P.AUTO]&&!(a===P.DISK&&2===c),A.accept=Q[P[a]||P.AUTO],C=a,G=c,H=b,I=d,A.click()},this.openURLChooserDialog=function(a,b,c,d){var e;try{e=localStorage&&localStorage[T]}catch(a){}var f=q.systemPause(!0);if(e=prompt("Load file from URL:",e||""),e=e&&e.toString().trim()){try{localStorage[T]=e}catch(a){}this.readFromURL(e,a,c,b,d,function(){f||q.systemPause(!1)})}else f||q.systemPause(!1)},this.readFromFile=function(a,b,c,d,e,f){wmsx.Util.log("Reading file: "+a.name);var g=new FileReader;g.onload=function(g){var h=new Uint8Array(g.target.result),i={name:a.name,content:h,lastModifiedDate:a.lastModified?new Date(a.lastModified):a.lastModifiedDate};p.loadFromFile(i,b,c,d,e),f&&f(!0)},g.onerror=function(a){n("File reading error: "+a.target.error.name+U),f&&f(!1)},g.readAsArrayBuffer(a)},this.readFromURL=function(a,b,c,d,e,f){ new wmsx.MultiDownloader([{url:a}],function(g){var h={name:a,content:g[0].content,lastModifiedDate:null};p.loadFromFile(h,b,c,d,e),f&&f(!0)},function(a){n("URL reading error: "+a.error),f&&f(!1)}).start()},this.readFromFiles=function(a,b,c,d,e,f){new wmsx.MultiFileReader(a,function(a){p.loadFromFiles(a,b,c,d,e),f&&f(!0)},function(a,b,c){c||(b+=U),n("File reading error: "+b),f&&f(!1)},b===P.AUTO_AS_DISK||b===P.FILES_AS_DISK||b===P.ZIP_AS_DISK?-1:void 0).start()},this.loadFromContent=function(a,b,c,d,e,f,g){return this.loadFromFile({name:a,content:b},c,d,e,f,g)},this.loadFromFile=function(a,e,f,g,h,i){var j,k;if(e===P.AUTO_AS_DISK||e===P.FILES_AS_DISK||e===P.ZIP_AS_DISK){try{if(e===P.FILES_AS_DISK){if(c([a],f,g,h))return}else if(j=wmsx.Util.checkContentIsZIP(a.content)){if(b(m(a.name),j,f,g,h))return}else if(e===P.ZIP_AS_DISK)k="Not a ZIP file!";else if(c([a],f,g,h))return}catch(a){a.wmsx&&(k=a.message)}n("Error loading "+S[e]+(k?": "+k:""))}else{if(j=wmsx.Util.checkContentIsZIP(a.content))try{if(d(wmsx.Util.getZIPFilesSorted(j),e,f,g,h,i,!0))return;if(e===P.AUTO&&b(m(a.name),j,f,g,h))return}catch(a){wmsx.Util.error(a)}else if(d([a],e,f,g,h,i,!1))return;n("No valid "+S[e]+" found.")}},this.loadFromFiles=function(a,b,e,f,g){if(a=wmsx.Util.asNormalArray(a).slice(0),a.sort(function(a,b){return a.nameb.name?1:0}),b===P.AUTO_AS_DISK||b===P.FILES_AS_DISK||b===P.ZIP_AS_DISK){var h;try{if(c(a,e,f,g))return}catch(a){a.wmsx&&(h=a.message)}n("Error loading "+S[b]+(h?": "+h:""))}else{if(d(a,b,e,f,g,null,!1))return;n("No valid "+S[b]+" found.")}},this.loadFromContentAsSlot=function(a,b,c,d,e,f,h){var i=wmsx.Util.checkContentIsZIP(b);if(i)try{for(var j=wmsx.Util.getZIPFilesSorted(i),k=0;k0&&(this.keysByLegacyCode[a.c]=a))},function(a,b,c,d){a.VK_1={wc:1,d:"Digit1",c:49,n:"1"},a.VK_2={wc:2,d:"Digit2",c:50,n:"2"},a.VK_3={wc:3,d:"Digit3",c:51,n:"3"},a.VK_4={wc:4,d:"Digit4",c:52,n:"4"},a.VK_5={wc:5,d:"Digit5",c:53,n:"5"},a.VK_6={wc:6,d:"Digit6",c:54,n:"6"},a.VK_7={wc:7,d:"Digit7",c:55,n:"7"},a.VK_8={wc:8,d:"Digit8",c:56,n:"8"},a.VK_9={wc:9,d:"Digit9",c:57,n:"9"},a.VK_0={wc:10,d:"Digit0",c:48,n:"0"},a.VK_F1={wc:21,d:"F1",c:112,n:"F1"},a.VK_F2={wc:22,d:"F2",c:113,n:"F2"},a.VK_F3={wc:23,d:"F3",c:114,n:"F3"},a.VK_F4={wc:24,d:"F4",c:115,n:"F4"},a.VK_F5={wc:25,d:"F5",c:116,n:"F5"},a.VK_F6={wc:26,d:"F6",c:117,n:"F6"},a.VK_F7={wc:27,d:"F7",c:118,n:"F7"},a.VK_F8={wc:28,d:"F8",c:119,n:"F8"},a.VK_F9={wc:29,d:"F9",c:120,n:"F9"},a.VK_F10={wc:30,d:"F10",c:121,n:"F10"},a.VK_F11={wc:31,d:"F11",c:122,n:"F11"},a.VK_F12={wc:32,d:"F12",c:123,n:"F12"},a.VK_Q={wc:101,d:"KeyQ",c:81,n:"Q"},a.VK_W={wc:102,d:"KeyW",c:87,n:"W"},a.VK_E={wc:103,d:"KeyE",c:69,n:"E"},a.VK_R={wc:104,d:"KeyR",c:82,n:"R"},a.VK_T={wc:105,d:"KeyT",c:84,n:"T"},a.VK_Y={wc:106,d:"KeyY",c:89,n:"Y"},a.VK_U={wc:107,d:"KeyU",c:85,n:"U"},a.VK_I={wc:108,d:"KeyI",c:73,n:"I"},a.VK_O={wc:109,d:"KeyO",c:79,n:"O"},a.VK_P={wc:110,d:"KeyP",c:80,n:"P"},a.VK_A={wc:111,d:"KeyA",c:65,n:"A"},a.VK_S={wc:112,d:"KeyS",c:83,n:"S"},a.VK_D={wc:113,d:"KeyD",c:68,n:"D"},a.VK_F={wc:114,d:"KeyF",c:70,n:"F"},a.VK_G={wc:115,d:"KeyG",c:71,n:"G"},a.VK_H={wc:116,d:"KeyH",c:72,n:"H"},a.VK_J={wc:117,d:"KeyJ",c:74,n:"J"},a.VK_K={wc:118,d:"KeyK",c:75,n:"K"},a.VK_L={wc:119,d:"KeyL",c:76,n:"L"},a.VK_Z={wc:120,d:"KeyZ",c:90,n:"Z"},a.VK_X={wc:121,d:"KeyX",c:88,n:"X"},a.VK_C={wc:122,d:"KeyC",c:67,n:"C"},a.VK_V={wc:123,d:"KeyV",c:86,n:"V"},a.VK_B={wc:124,d:"KeyB",c:66,n:"B"},a.VK_N={wc:125,d:"KeyN",c:78,n:"N"},a.VK_M={wc:126,d:"KeyM",c:77,n:"M"},a.VK_ESCAPE={wc:201,d:"Escape",c:27,n:"Esc",fn:!0},a.VK_BACKSPACE={wc:202,d:"Backspace",c:8,n:"BackSpc",fn:!0},a.VK_TAB={wc:203,d:"Tab",c:9,n:"Tab",fn:!0},a.VK_ENTER={wc:204,d:"Enter",c:13,n:"Enter",fn:!0},a.VK_SPACE={wc:205,d:"Space",c:32,n:"Space",fn:!0},a.VK_BACKQUOTE={wc:221,d:"Backquote",c:192,n:"`"},a.VK_MINUS={wc:222,d:"Minus",c:189,n:"-"},a.VK_EQUALS={wc:223,d:"Equal",c:187,n:"="},a.VK_INT_YEN={wc:224,d:"IntlYen",c:-1,n:"Int ¥"},a.VK_OPEN_BRACKET={wc:225,d:"BracketLeft",c:219,n:"["},a.VK_CLOSE_BRACKET={ wc:226,d:"BracketRight",c:221,n:"]"},a.VK_SEMICOLON={wc:227,d:"Semicolon",c:186,n:";"},a.VK_QUOTE={wc:228,d:"Quote",c:222,n:"'"},a.VK_BACKSLASH={wc:229,d:"Backslash",c:220,n:"\\"},a.VK_INT_BACKSLASH={wc:230,d:"IntlBackslash",c:226,n:"Int \\"},a.VK_COMMA={wc:231,d:"Comma",c:188,n:","},a.VK_PERIOD={wc:232,d:"Period",c:190,n:"."},a.VK_SLASH={wc:233,d:"Slash",c:191,n:"/"},a.VK_INT_RO={wc:234,d:"IntlRo",c:193,n:"Int ろ"},a.VK_INSERT={wc:251,d:"Insert",c:45,n:"Ins",fn:!0},a.VK_DELETE={wc:252,d:"Delete",c:46,n:"Del",fn:!0},a.VK_HOME={wc:253,d:"Home",c:36,n:"Home",fn:!0},a.VK_END={wc:254,d:"End",c:35,n:"End",fn:!0},a.VK_PAGE_UP={wc:255,d:"PageUp",c:33,n:"PgUp",fn:!0},a.VK_PAGE_DOWN={wc:256,d:"PageDown",c:34,n:"PgDown",fn:!0},a.VK_UP={wc:271,d:"ArrowUp",c:38,n:"Up",fn:!0},a.VK_DOWN={wc:272,d:"ArrowDown",c:40,n:"Down",fn:!0},a.VK_LEFT={wc:273,d:"ArrowLeft",c:37,n:"Left",fn:!0},a.VK_RIGHT={wc:274,d:"ArrowRight",c:39,n:"Right",fn:!0},a.VK_PRINT_SCREEN={wc:281,d:"PrintScreen",c:44,n:"PrtScr",fn:!0},a.VK_SCROLL_LOCK={wc:282,d:"ScrollLock",c:145,n:"ScrLck",fn:!0},a.VK_PAUSE={wc:283,d:"Pause",c:19,n:"Pause",fn:!0},a.VK_BREAK={wc:284,d:"",c:3,n:"Break",fn:!0},a.VK_CONTEXT={wc:285,d:"ContextMenu",c:93,n:"Context",fn:!0},a.VK_LSHIFT={wc:301,d:"ShiftLeft",c:16|b,n:"L-Shift",fn:!0},a.VK_LCONTROL={wc:302,d:"ControlLeft",c:17|b,n:"L-Control",fn:!0},a.VK_LALT={wc:303,d:"AltLeft",c:18|b,n:"L-Alt",fn:!0},a.VK_LMETA={wc:304,d:"MetaLeft",c:91|b,n:"L-Meta",fn:!0},a.VK_RSHIFT={wc:305,d:"ShiftRight",c:16|c,n:"R-Shift",fn:!0},a.VK_RCONTROL={wc:306,d:"ControlRight",c:17|c,n:"R-Control",fn:!0},a.VK_RALT={wc:307,d:"AltRight",c:18|c,n:"R-Alt",fn:!0},a.VK_RMETA={wc:308,d:"MetaRight",c:91|c,n:"R-Meta",fn:!0},a.VK_CAPS_LOCK={wc:309,d:"CapsLock",c:20,n:"CapsLock",fn:!0},a.VK_NON_CONVERT={wc:310,d:"NonConvert",c:29,n:"NonConvert",fn:!0},a.VK_CONVERT={wc:311,d:"Convert",c:28,n:"Convert",fn:!0},a.VK_KANA={wc:312,d:"KanaMode",c:-1,n:"Kana",fn:!0},a.VK_NUMLOCK={wc:401,d:"NumLock",c:144,n:"NumLock"},a.VK_NUM_COMMA={wc:402,d:"NumpadComma",c:110|d,n:"Num ,"},a.VK_NUM_DIVIDE={wc:403,d:"NumpadDivide",c:111|d,n:"Num /"},a.VK_NUM_MULTIPLY={wc:404,d:"NumpadMultiply",c:106|d,n:"Num *"},a.VK_NUM_MINUS={wc:405,d:"NumpadSubtract",c:109|d,n:"Num -"},a.VK_NUM_PLUS={wc:406,d:"NumpadAdd",c:107|d,n:"Num +"},a.VK_NUM_ENTER={wc:407,d:"NumpadEnter",c:13|d,n:"Num Enter",fn:!0},a.VK_NUM_PERIOD={wc:408,d:"NumpadDecimal",c:194|d,n:"Num .",fn:!0},a.VK_NUM_1={wc:421,d:"Numpad1",c:97|d,n:"Num 1",fn:!0},a.VK_NUM_2={wc:422,d:"Numpad2",c:98|d,n:"Num 2",fn:!0},a.VK_NUM_3={wc:423,d:"Numpad3",c:99|d,n:"Num 3",fn:!0},a.VK_NUM_4={wc:424,d:"Numpad4",c:100|d,n:"Num 4",fn:!0},a.VK_NUM_5={wc:425,d:"Numpad5",c:101|d,n:"Num 5",fn:!0},a.VK_NUM_6={wc:426,d:"Numpad6",c:102|d,n:"Num 6",fn:!0},a.VK_NUM_7={wc:427,d:"Numpad7",c:103|d,n:"Num 7",fn:!0},a.VK_NUM_8={wc:428,d:"Numpad8",c:104|d,n:"Num 8",fn:!0},a.VK_NUM_9={wc:429,d:"Numpad9",c:105|d,n:"Num 9",fn:!0},a.VK_NUM_0={wc:430,d:"Numpad0",c:96|d,n:"Num 0",fn:!0},a.VK_VOID={wc:-1,d:"",c:-1,n:"Unbound",fn:!0},a.VK_BR_QUOTE={wc:221,d:"Backquote",c:192,n:"'",a:"BR"},a.VK_BR_ACUTE={wc:225,d:"BracketLeft",c:219,n:"´",a:"BR"},a.VK_BR_OPEN_BRACKET={wc:226,d:"BracketRight",c:221,n:"[",a:"BR"},a.VK_BR_CEDILLA={wc:227,d:"Semicolon",c:186,n:"Ç",a:"BR"},a.VK_BR_TILDE={wc:228,d:"Quote",c:222,n:"~",a:"BR"},a.VK_BR_CLOSE_BRACKET={wc:229,d:"Backslash",c:220,n:"]",a:"BR"},a.VK_BR_SEMICOLON={wc:233,d:"Slash",c:191,n:";",a:"BR"},a.VK_BR_BACKSLASH={wc:230,d:"IntlBackslash",c:226,n:"\\",a:"BR"},a.VK_BR_SLASH={wc:234,d:"IntlRo",c:193,n:"/",a:"BR"},a.VK_JP_CIRCUMFLEX={wc:223,d:"Equal",c:187,n:"^",a:"JP"},a.VK_JP_YEN={wc:224,d:"IntlYen",c:-1,n:"¥",a:"JP"},a.VK_JP_ARROBA={wc:225,d:"BracketLeft",c:219,n:"@",a:"JP"},a.VK_JP_OPEN_BRACKET={wc:226,d:"BracketRight",c:221,n:"[",a:"JP"},a.VK_JP_COLLON={wc:228,d:"Quote",c:222,n:":",a:"JP"},a.VK_JP_CLOSE_BRACKET={wc:229,d:"Backslash",c:220,n:"]",a:"JP"},a.VK_JP_RO={wc:234,d:"IntlRo",c:193,n:"\\ ろ",a:"JP"},a.VK_JP_NON_CONVERT={wc:310,d:"NonConvert",c:29,n:"NonConvert",fn:!0},a.VK_ES_ORDINAL={wc:221,d:"Backquote",c:192,n:"º",a:"ES"},a.VK_ES_QUOTE={wc:222,d:"Minus",c:189,n:"'",a:"ES"},a.VK_ES_INV_EXCLA={wc:223,d:"Equal",c:187,n:"¡",a:"ES"},a.VK_ES_GRAVE={wc:225,d:"BracketLeft",c:219,n:"`",a:"ES"},a.VK_ES_PLUS={wc:226,d:"BracketRight",c:221,n:"+",a:"ES"},a.VK_ES_ENNE={wc:227,d:"Semicolon",c:186,n:"Ñ",a:"ES"},a.VK_ES_ACUTE={wc:228,d:"Quote",c:222,n:"´",a:"ES"},a.VK_ES_CEDILLA={wc:229,d:"Backslash",c:220,n:"Ç",a:"ES"},a.VK_ES_LESSER={wc:230,d:"IntlBackslash",c:226,n:"<",a:"ES"},a.VK_ES_MINUS={wc:233,d:"Slash",c:191,n:"-",a:"ES"},a.VK_NL_ARROBA={wc:221,d:"Backquote",c:192,n:"@",a:"NL"},a.VK_NL_SLASH={wc:222,d:"Minus",c:189,n:"/",a:"NL"},a.VK_NL_ORDINAL={wc:223,d:"Equal",c:187,n:"°",a:"NL"},a.VK_NL_UMLAUT={wc:225,d:"BracketLeft",c:219,n:"¨",a:"NL"},a.VK_NL_STAR={wc:226,d:"BracketRight",c:221,n:"*",a:"NL"},a.VK_NL_PLUS={wc:227,d:"Semicolon",c:186,n:"+",a:"NL"},a.VK_NL_ACUTE={wc:228,d:"Quote",c:222,n:"´",a:"NL"},a.VK_NL_LESSER={wc:229,d:"Backslash",c:220,n:"<",a:"NL"},a.VK_NL_CLOSE_BRACKET={wc:230,d:"IntlBackslash",c:226,n:"]",a:"NL"},a.VK_NL_MINUS={wc:233,d:"Slash",c:191,n:"-",a:"NL"},a.VK_IT_BACKSLASH={wc:221,d:"Backquote",c:192,n:"\\",a:"IT"},a.VK_IT_QUOTE={wc:222,d:"Minus",c:189,n:"'",a:"IT"},a.VK_IT_GRAVE_I={wc:223,d:"Equal",c:187,n:"ì",a:"IT"},a.VK_IT_GRAVE_E={wc:225,d:"BracketLeft",c:219,n:"è",a:"IT"},a.VK_IT_PLUS={wc:226,d:"BracketRight",c:221,n:"+",a:"IT"},a.VK_IT_GRAVE_O={wc:227,d:"Semicolon",c:186,n:"ò",a:"IT"},a.VK_IT_GRAVE_A={wc:228,d:"Quote",c:222,n:"à",a:"IT"},a.VK_IT_GRAVE_U={wc:229,d:"Backslash",c:220,n:"ù",a:"IT"},a.VK_IT_LESSER={wc:230,d:"IntlBackslash",c:226,n:"<",a:"IT"},a.VK_IT_MINUS={wc:233,d:"Slash",c:191,n:"-",a:"IT"},a.VK_FR_2u={wc:221,d:"Backquote",c:192,n:"²",a:"FR"},a.VK_FR_CLOSE_PARENS={wc:222,d:"Minus",c:189,n:")",a:"FR"},a.VK_FR_EQUAL={wc:223,d:"Equal",c:187,n:"=",a:"FR"},a.VK_FR_A={wc:101,d:"KeyQ",c:81,n:"A",a:"FR"},a.VK_FR_Z={wc:102,d:"KeyW",c:87,n:"Z",a:"FR"},a.VK_FR_CIRCUMFLEX={wc:225,d:"BracketLeft",c:219,n:"^",a:"FR"},a.VK_FR_DOLLAR={wc:226,d:"BracketRight",c:221,n:"$",a:"FR"},a.VK_FR_Q={wc:111,d:"KeyA",c:65,n:"Q",a:"FR"},a.VK_FR_M={wc:227,d:"Semicolon",c:186,n:"M",a:"FR"},a.VK_FR_U_GRAVE={wc:228,d:"Quote",c:222,n:"ù",a:"FR"},a.VK_FR_STAR={wc:229,d:"Backslash",c:220,n:"*",a:"FR"},a.VK_FR_LESSER={wc:230,d:"IntlBackslash",c:226,n:"<",a:"FR"},a.VK_FR_W={wc:120,d:"KeyZ",c:90,n:"W",a:"FR"},a.VK_FR_COMMA={wc:126,d:"KeyM",c:77,n:",",a:"FR"},a.VK_FR_SEMICOLON={wc:231,d:"Comma",c:188,n:";",a:"FR"},a.VK_FR_COLON={wc:232,d:"Period",c:190,n:":",a:"FR"},a.VK_FR_EXCLAMATION={wc:233,d:"Slash",c:191,n:"!",a:"FR"};for(var e in a)a.addKeyToIdentification(a[e])}(wmsx.DOMKeys,wmsx.DOMKeys.LOCLEFT,wmsx.DOMKeys.LOCRIGHT,wmsx.DOMKeys.LOCNUM),wmsx.DOMKeys.isModifierKey=function(a){var b=a.keyCode;return 16===b||17===b||18===b||91===b},wmsx.DOMKeys.codeNewForKeyboardEvent=function(a){var b=this.keysByCode[a.code]||this.keysByLegacyCode[a.keyCode|a.location<0){var d=a.keyCode,e=a.key;if(c&&c.fn)e=c.n;else{var f=e&&e.toUpperCase();switch(f&&"UNIDENTIFIED"!==f&&"UNDEFINED"!==f&&"UNKNOWN"!==f?"DEAD"===f&&(e="Dead#"+d):e=a.code||"#"+d,1===e.length?e=e.toUpperCase():e.length>12&&(e=e.substr(0,12)),a.location){case 1:e="L-"+e;break;case 2:e="R-"+e;break;case 3:e="Num "+e}}return c||(wmsx.Util.warning("New Host Key discovered:",a),b=WMSX.userPreferences.current.customHostKeys.nextCode++,c={wc:b,d:a.code||"",c:a.code?0:a.keyCode&this.IGNORE_ALL_MODIFIERS_MASK|a.location<0?A:WMSX.BOOT_DURATION_AUTO}function g(){var a=(wmsx.Util.userLanguage()||"en-US").toUpperCase();"NL"===a.substr(0,2)&&(a="en-US");for(var b=0;b=0?j.setKeyboard(a,!1):g()}var j=this;this.connect=function(a,b){o=a,o.addMachineTypeStateListener(j,!0),p=b},this.connectPeripherals=function(a){q=a},this.resetControllers=function(){this.releaseControllers(),B&&f()},this.machineTypeStateUpdate=function(){var a=o.getMachineLang();a!==w&&(w=a,i())},this.powerOn=function(){if(WMSX.BOOT_KEYS||WMSX.BOOT_KEYS_ONCE){for(var a=(WMSX.BOOT_KEYS||WMSX.BOOT_KEYS_ONCE).split(","),b=[],c=0;c0&&--C,F&&I){if(--G===H||0===G){var a=G>0,b=r.SPACE.m;d(b[0],b[1],a)}G<=0&&(G=F)}},this.readKeyboardPort=function(a){return C>0?y[a]&z[a]:y[a]},this.toggleKeyboardLayout=function(a){var b;b=a?n?t.length-1:t.indexOf(m)-1||0:n?0:t.indexOf(m)+1||0,b<0||b>=t.length?g():this.setKeyboard(t[b],!1),q.showOSD("Host Keyboard: "+this.getCurrentKeyboardDesc(),!0)},this.getCurrentKeyboardDesc=function(){return(n?"AUTO: ":"")+m},this.setKeyboard=function(a,b){m=a,n=b,k(),q&&q.keyboardSettingsStateUpdate();var c=b?void 0:a;WMSX.userPreferences.current.hostKeyboard[w]!==c&&(WMSX.userPreferences.current.hostKeyboard[w]=c,WMSX.userPreferences.setDirty(),WMSX.userPreferences.save())},this.setTurboFireClocks=function(a){F=a,H=F/2|0,G=0},this.releaseControllers=function(){for(var a in x)x[a]&&this.processMSXKey(a,!1);I=!1},this.getKeyMapping=function(a){return D[a]},this.clearKey=function(a){0!==D[a].length&&(v[m]||h(),D[a].length=0,l(),WMSX.userPreferences.setDirty())},this.customizeKey=function(a,b){if(E[b.wc]!==a){v[m]||h();for(var c in D){var d=D[c];if(0!==d.length)for(var e;(e=wmsx.Util.arrayFindIndex(d,function(a){return a.wc===b.wc}))>=0;)d.splice(e,1)}d=D[a],d.length>=M&&d.splice(0,d.length-(M-1)),d.push(b),l(),WMSX.userPreferences.setDirty()}},this.processKey=function(a,b){var e=E[a];if(!e){if(c.processKey(a,b))return;e=E[a&L]}if(e){if(a===K&&x.CONTROL){var f=r.CONTROL.m;d(f[0],f[1],!1)}this.processMSXKey(e,b)}},this.processMSXKey=function(a,b){if(F&&"SPACE"===a){if(I===b)return;b&&(G=H),I=b}if(x[a]!==b){x[a]=b;var c=r[a].m;d(c[0],c[1],b)}};var k=function(){var a=v[m]||u[m];for(var b in r)D[b]=a[b]?a[b].constructor===Array?a[b]:[a[b]]:[];l()},l=function(){E={};for(var a in D)if(0!==D[a].length)for(var b=0;b>8,(240&d)>>4,1&d)}},this.netClientApplyMatrixChanges=function(a){for(var b=0,c=a.length;b>8,(240&a[b])>>4,1&a[b])},this.saveState=function(){return{k:wmsx.Util.storeInt8BitArrayToStringBase64(y),kb:wmsx.Util.storeInt8BitArrayToStringBase64(z),bf:A,ba:B,bc:C}},this.loadState=function(a){wmsx.Util.restoreStringBase64ToInt8BitArray(a.k,y),wmsx.Util.restoreStringBase64ToInt8BitArray(a.kb,z),A=a.bf,B=a.ba,C=a.bc};var m,n,o,p,q,r=wmsx.KeyboardKeys,s=wmsx.DOMKeys,t=[],u={},v={},w="en",x={},y=wmsx.Util.arrayFill(new Array(12),255),z=wmsx.Util.arrayFill(new Array(12),255),A=WMSX.BOOT_KEYS_FRAMES,B=!1,C=0,D={},E={},F=0,G=0,H=0,I=!1,J=new Array(100);J.length=0;var K=s.VK_RALT.wc,L=s.IGNORE_ALL_MODIFIERS_MASK,M=4,N={CTRL:"CONTROL",ESC:"ESCAPE",CAPS:"CAPSLOCK",KANA:"CODE",RETURN:"ENTER",RET:"ENTER",0:"D0",1:"D1",2:"D2",3:"D3",4:"D4",5:"D5",6:"D6",7:"D7",8:"D8",9:"D9"};i()},wmsx.GamepadJoysticksControls=function(a,b,c){"use strict";function d(){-2===w?p=q=null:-1===w&&(v=-1,n.controllersClockPulse(!0)),x=0===w,h(),e()}function e(){var a=p?J+" 1":null,c=q?J+" 2":null;b.updateJoystickConnections(x?c:a,x?a:c)}function f(a,c){e(),b.showStatusMessage("Joystick "+(a?"1":"2")+(c?" connected":" disconnected"))}function g(a,b,c){if(c&&0!==c.length){var d=a.settings.device;if(d>=0)return c[d]&&c[d].buttons.length>0?new m(d,a):null;for(var e=0,f=c.length;e0&&!(e===b.device||p&&p.index===e||q&&q.index===e))return new m(e,a)}}function h(){B.reset(),C.reset()}function i(a,b,d){if(d===E)return j(a);var e=b.buttonsState,f=e.J_A;for(var g in t){var h=d.buttons[g];if(h&&h.length>0){ for(var i=!1,k=0;!i&&k=0&&a.getButtonDigital(c))return F.joystickButtonDetected(wmsx.GamepadButtons[b],(E===s?1:0)^x)}}function k(){D[0]=r=WMSX.userPreferences.current.joysticks[0],D[1]=s=WMSX.userPreferences.current.joysticks[1]}function l(){this.reset=function(){this.analogDirection=-1,this.buttonsState={},this.portValue=63,this.pin8Value=0},this.reset()}function m(a,b){this.index=a,this.update=function(b){return!!(c=b[a])},this.hasMoved=function(){var a=c.timestamp;return!a||a>i&&(i=a,!0)},this.getButtonDigital=function(a){var b=c.buttons[a];return"object"==typeof b?b.pressed||b.value>.5:b>.5},this.getStickDirection=function(){var a=c.axes[d],b=c.axes[e];if(isNaN(a)||(a<0?-a:a)=1&&(i-=1),8*i|0};var c,d=b.settings.xAxis,e=b.settings.yAxis,f=b.settings.xAxisSig,g=b.settings.yAxisSig,h=b.settings.deadzone,i=Number.MIN_VALUE}var n=this;this.connectPeripherals=function(a){o=a},this.powerOn=function(){(u=!!navigator.getGamepads)&&(k(),w>=-1&&d())},this.powerOff=function(){u=!1},this.releaseControllers=function(){h()},this.resetControllers=function(){this.releaseControllers(),e()},this.readControllerPort=function(c){return a.netController?b.netGetMergedPortValues()[c]:this.readLocalControllerPort(c)},this.readLocalControllerPort=function(a){var b=1===a^x?C:B;return b.pin8Value?63:z>A?16|b.portValue:b.portValue},this.writeControllerPin8Port=function(a,b){(1===a^x?C:B).pin8Value=b},this.toggleMode=function(c){if(!u)return void b.showErrorMessage("Joysticks unavailable (not supported by browser)");var d=(2!==a.netPlayMode||G?H:I)[c?1:0][w+2];this.setMode(d),b.showStatusMessage("Joysticks "+this.getModeDesc())},this.setMode=function(a){w=a,d()},this.getMode=function(){return w},this.getModeDesc=function(){switch(w){case-1:return"AUTO";case 0:return"AUTO (swapped)";default:return u?"DISABLED":"NOT SUPPORTED"}},this.getSwappedState=function(){return x},this.netClientAdaptToServerControlsModes=function(a){G=a.sw,-2!==w&&(-1!==w||G?0===w&&G&&this.setMode(-1):this.setMode(0))},this.setTurboFireClocks=function(a){y=a,A=y/2|0,z=0},this.controllersClockPulse=function(a){if(u&&-2!==w&&(++v>=K&&(v=0),p||q||0===v)){var b=navigator.getGamepads();y&&--z<=0&&(z=y),p?p.update(b)?p.hasMoved()&&i(p,B,r):(p=null,B.reset(),a||f(!0,!1)):0===v&&(p=g(r,s,b))&&!a&&f(!0,!0),q?q.update(b)?q.hasMoved()&&i(q,C,s):(q=null,C.reset(),a||f(!1,!1)):0===v&&(q=g(s,r,b))&&!a&&f(!1,!0)}},this.getMappingForControl=function(a,b){var c=D[b^x];return t[a].mask?c.buttons[a]:0!==c.buttons[a].length||0!==c.virtualButtonsKeys[a].length?{from:c.buttons[a],to:c.virtualButtonsKeys[a]}:[]},this.getMappingPopupText=function(a,b){var c=!t[a].mask;return{heading:c?"Virtual Button mapping:":"Button mapped to host buttons:",footer:c?"Press new button / key.
(right-click to clear)":"Press new button.
(right-click to clear)"}},this.customizeControl=function(a,b,c){var d;if(c.wc){if(c.wc&&t[a].mask)return;if(d=D[b^x].virtualButtonsKeys[a],wmsx.Util.arrayFind(d,function(a){return a.wc===c.wc}))return}else if(d=D[b^x].buttons[a],wmsx.Util.arrayFind(d,function(a){return a.b===c.b}))return;d.length>=M&&d.splice(0,d.length-(M-1)),d.push(c),h(),WMSX.userPreferences.setDirty()},this.clearControl=function(a,b){D[b^x].buttons[a].length=0,t[a].mask||(D[b^x].virtualButtonsKeys[a].length=0),h(),WMSX.userPreferences.setDirty()},this.startButtonDetection=function(a,b){E=D[a^x],F=b},this.stopButtonDetection=function(){E=F=null};var o,p,q,r,s,t=wmsx.JoystickButtons,u=!1,v=1,w=WMSX.JOYSTICKS_MODE-1,x=!1,y=0,z=0,A=0,B=new l,C=new l,D=[],E=null,F=null,G=!1,H=[[-1,0,-2],[0,-2,-1]],I=[[0,-2,-1],[-1,0,-2]],J=wmsx.ControllersHub.JOYSTICK,K=60,L=[15,14,6,7,5,13,9,11,10],M=4},wmsx.DOMJoykeysControls=function(a,b,c){"use strict";function d(){p=1===o||3===o,h(),g(),e()}function e(){q={},o>=0&&f(l.buttons,0),o>=2&&f(m.buttons,1)}function f(a,b){for(var c in a)for(var d=0;d=0?C+" 1":null,c=o>=2?C+" 2":null;b.updateJoykeysConnections(p?c:a,p?a:c)}function h(){s.reset(),t.reset()}function i(){y[0]=l=WMSX.userPreferences.current.joykeys[0],y[1]=m=WMSX.userPreferences.current.joykeys[1]}function j(){this.reset=function(){this.portValue=63,this.pin8Value=0},this.reset()}this.connectPeripherals=function(a){k=a},this.powerOn=function(){i(),o>=0&&d()},this.powerOff=function(){},this.releaseControllers=function(){h()},this.resetControllers=function(){this.releaseControllers(),g()},this.readControllerPort=function(c){return a.netController?b.netGetMergedPortValues()[c]:this.readLocalControllerPort(c)},this.readLocalControllerPort=function(a){var b=u[a^p];return b.pin8Value?63:w>x?16|b.portValue:b.portValue},this.writeControllerPin8Port=function(a,b){u[a^p].pin8Value=b},this.controllersClockPulse=function(){o>=0&&v&&--w<=0&&(w=v)},this.toggleMode=function(c){var d=(2!==a.netPlayMode||z?A:B)[c?1:0][o+1];this.setMode(d),b.showStatusMessage("Joykeys "+this.getModeDesc())},this.setMode=function(a){a>=0&&o<0&&(r={}),o=a,d()},this.getMode=function(){return o},this.getModeDesc=function(){switch(o){case 0:return"SINGLE";case 1:return"SINGLE (port 2)";case 2:return"DUAL";case 3:return"DUAL (swapped)";default:return"DISABLED"}},this.getSwappedState=function(){return p},this.netClientAdaptToServerControlsModes=function(a){z=a.sw,-1!==o&&(z?1===o?this.setMode(0):3===o&&this.setMode(2):0===o?this.setMode(1):2===o&&this.setMode(3))},this.setTurboFireClocks=function(a){v=a,x=v/2|0,w=0},this.processKey=function(a,b){if(o<0)return c.processKey(a,b);var d=q[a];if(!d)return c.processKey(a,b);if(r[a]===b)return void(b||c.processKey(a,b));r[a]=b;for(var e=0;e(right-click to clear)"}},this.customizeControl=function(a,b,c){if(!q[c.wc]||!wmsx.Util.arrayFind(q[c.wc],function(c){return c.b===a&&c.p===b})){var d=y[b^p].buttons[a];d.length>=D&&d.splice(0,d.length-(D-1)),d.push(c),h(),e(),WMSX.userPreferences.setDirty()}},this.clearControl=function(a,b){y[b^p].buttons[a].length=0,h(),e(),WMSX.userPreferences.setDirty()};var k,l,m,n=wmsx.JoystickButtons,o=WMSX.JOYKEYS_MODE,p=!1,q={},r={},s=new j,t=new j,u=[s,t],v=0,w=0,x=0,y=[],z=!1,A=[[0,1,2,3,-1],[3,-1,0,1,2]],B=[[1,3,0,-1,2],[2,1,-1,3,0]],C=wmsx.ControllersHub.JOYKEYS,D=4},wmsx.DOMMouseControls=function(a,b){"use strict";function c(a){C=void 0!==a?a:B<0?-1:B,z?q(y):p(x),n()}function d(a){return a===C?y.portValue:b.portValueAllReleased}function e(){if(G=!1,C<0)return w.showOSD("Mouse Pointer Locking only when MOUSE is ENABLED!",!0,!0);var a=t.requestPointerLock||t.mozRequestPointerLock||t.webkitRequestPointerLock;a&&a.apply(t)}function f(){G=!1;var a=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock;a&&a.apply(document)}function g(){x.portValue=-49&x.portValue|(3&~x.buttons)<<4}function h(){switch(x.readCycle){case 0:x.portValue=-16&x.portValue|x.readDX>>4&15;break;case 1:x.portValue=-16&x.portValue|15&x.readDX;break;case 2:x.portValue=-16&x.portValue|x.readDY>>4&15;break;case 3: x.portValue=-16&x.portValue|15&x.readDY;break;default:x.portValue=-16&x.portValue}}function i(){var a=Math.round(-x.dX);a>127?a=127:a<-127&&(a=-127),x.dX+=a,x.readDX=a;var b=Math.round(-x.dY);b>127?b=127:b<-127&&(b=-127),x.dY+=b,x.readDY=b}function j(a){if(!(C<0)){a.preventDefault();var b=0,c=0;F?(b=a.movementX||a.mozMovementX||a.webkitMovementX||0,c=a.movementY||a.mozMovementY||a.webkitMovementY||0):u&&(b=a.clientX-u.clientX,c=a.clientY-u.clientY),u=a,y.dX+=b/D,y.dY+=c/E,A=y}}function k(a){if(4&a.buttons&&(a.preventDefault(),s.togglePointerLock()),C>=0){if(G&&a.buttons)return 1&a.buttons&&!F&&e(),void(G=!1);y.buttons=3&a.buttons,z||g(),A=y}}function l(){var a=document.pointerLockElement||document.mozPointerLockElement||document.webkitPointerLockElement;F=a===t,w.mousePointerLocked(F),w.showOSD(F?"Mouse Pointer Locked":"Mouse Pointer Released",F)}function m(a,b){C=a,s.writeControllerPin8Port(C,b),n(),o("Mouse AUTO-ENABLED")}function n(){F&&C<0&&f(),b.updateMouseConnections(0===C?I:null,1===C?I:null),w.mouseActiveCursorStateUpdate(C>=0)}function o(a){b.showStatusMessage(a)}function p(a){return a.readCycle=-1,a.dX=0,a.dY=0,a.buttons=0,a.portValue=b.portValueAllReleased,a.pin8Value=0,a.lastPin8FlipBUSCycle=0,a.readDX=0,a.readDY=0,A=x,a}function q(a){return a.dX=0,a.dY=0,a.buttons=void 0,A=void 0,a}function r(a){return a===C?x.portValue:b.portValueAllReleased}var s=this;this.connect=function(a){v=a},this.connectPeripherals=function(a){w=a},this.powerOn=function(){c()},this.powerOff=function(){},this.releaseControllers=function(){C>=0&&(z?q(y):p(x))},this.resetControllers=function(){this.releaseControllers(),-1===B&&(C=-1),n()},this.screenFullscreenStateUpdate=function(a){G=a&&!F},this.toggleMode=function(a){var b;a?(b=B-1)<-2&&(b=1):(b=B+1)>1&&(b=-2),this.setMode(b),o("Mouse "+this.getModeDesc())},this.setMode=function(a){B=a,c()},this.setModeEffective=function(a){B=a.m,c(a.p)},this.getMode=function(){return B},this.getModeEffective=function(){return{m:B,p:C}},this.getModeDesc=function(){switch(B){case-1:return"AUTO";case 0:return"ENABLED";case 1:return"ENABLED (port 2)";default:return"DISABLED"}},this.netClientAdaptToServerControlsModes=function(a){this.setModeEffective(a.m)},this.readControllerPort=function(b){return a.netController?r(b):d(b)},this.writeControllerPin8Port=function(a,b){if(a===C){if(x.pin8Value^b){x.pin8Value=b;var c=v.getBUSCycles()-x.lastPin8FlipBUSCycle;x.lastPin8FlipBUSCycle+=c,c>J&&(x.readCycle=-1),++x.readCycle,0===x.readCycle&&i(),h()}}},this.portPin8Announced=function(a,b){1===b&&!H&&C<0&&0===a&&-1===B&&m(a,b)},this.togglePointerLock=function(){F?f():e()},this.setMouseInputElement=function(a){t=a,"onpointerlockchange"in document?document.addEventListener("pointerlockchange",l,!1):"onmozpointerlockchange"in document&&document.addEventListener("mozpointerlockchange",l,!1),t.addEventListener("mousemove",j),t.addEventListener("mousedown",k),t.addEventListener("mouseup",k)},this.setScreenPixelScale=function(a,b){D=a,E=b},this.getMappingForControl=function(a,b){return[{wc:999999,n:["Alt","CapsLock"]}]},this.getMappingPopupText=function(a,b){return{heading:"Lock / Unlock pointer:",footer:"or click Middle Button"}},this.customizeControl=function(a,b,c){},this.clearControl=function(a,b){},this.netGetMouseStateToSend=function(){return A},this.netClearMouseInfoToSend=function(){z?q(y):A=void 0},this.netServerGetMouseState=function(){return x},this.netServerReceiveClientMouseState=function(a){x.dX+=a.dX,x.dY+=a.dY,void 0!==a.buttons&&(x.buttons=a.buttons,g()),A=x},this.netClientReceiveServerMouseState=function(a){x=a},this.netSetClientMode=function(a){z=a,y=a?q({}):x};var t,u,v,w,x=p({}),y=x,z=!1,A=void 0,B=WMSX.MOUSE_MODE-1,C=-1,D=1,E=1,F=!1,G=!1,H=wmsx.Util.isMobileDevice(),I=wmsx.ControllersHub.MOUSE,J=wmsx.CPU.BASE_CLOCK/1e3*1.5|0},wmsx.DOMTouchControls=function(a,b,c,d){"use strict";function e(){C.classList.toggle("wmsx-poweroff",!V),C.classList.toggle("wmsx-paused",W)}function f(){J=-2===I?-1:-1===I?G&&H?0:-1:I,v(),u()}function g(a){if(wmsx.Util.blockEvent(a),E)return E.touchControlDetected("T_DIR",a)}function h(a){if(wmsx.Util.blockEvent(a),E)return E.touchControlDetected("T_DIR",a);if(null===Q){void 0===A&&m();var b=a.changedTouches[0];Q=b.identifier,k(b.pageX,b.pageY)}}function i(a){wmsx.Util.blockEvent(a),null!==Q&&(Q=null,l(-1))}function j(a){if(wmsx.Util.blockEvent(a),null!==Q)for(var b=a.changedTouches,c=0;cS&&(c=(1-Math.atan2(d,e)/Math.PI)/2,c+=1/16,c>=1&&(c-=1),c=8*c|0),l(c)}function l(a){if(R!==a){if(P.wmsxMappingIsKeys){var d=Z[R+1];d[0]&&c.processMSXKey(d[0],!1),d[1]&&c.processMSXKey(d[1],!1);var e=Z[a+1];e[0]&&c.processMSXKey(e[0],!0),e[1]&&c.processMSXKey(e[1],!0)}else U.portValue=-16&U.portValue|Y[a+1];a>=0&&b.hapticFeedback(),R=a}}function m(){var a=P.getBoundingClientRect();S=.14*(a.right-a.left)|0,A=((a.left+a.right)/2|0)+window.pageXOffset,B=((a.top+a.bottom)/2|0)+window.pageYOffset}function n(a){if(wmsx.Util.blockEvent(a),E)return E.touchControlDetected(a.target.wmsxControl,a);p(a.target.wmsxMapping,!0)}function o(a){wmsx.Util.blockEvent(a),p(a.target.wmsxMapping,!1)}function p(a,d){a&&(d&&b.hapticFeedback(),a.button?d?(U.portValue&=~a.mask,K&&16&a.mask&&(L=M+1)):U.portValue|=a.mask:a.key&&c.processMSXKey(a.key,d))}function q(a){wmsx.Util.blockEvent(a),b.hapticFeedback(),d.processControlState(V?F.PAUSE:F.POWER,!0)}function r(a){wmsx.Util.blockEvent(a),b.hapticFeedback(),d.processControlState(W?F.FRAME:F.FAST_SPEED,!0)}function s(a){wmsx.Util.blockEvent(a),W||(b.hapticFeedback(),d.processControlState(W?F.FRAME:F.FAST_SPEED,!1))}function t(){y.updateMappingFor("T_DIR");for(var a in T)y.updateMappingFor(a)}function u(){b.updateTouchControlsConnections(0===J?X:null,1===J?X:null)}function v(){U.reset(),A=B=void 0,Q=null,l(-1)}function w(){D=WMSX.userPreferences.current.touch,N=!!D.directionalBig,O=!!D.mirrored}function x(){this.reset=function(){this.portValue=63,this.pin8Value=0},this.reset()}var y=this;this.connect=function(a){a.addPowerAndUserPauseStateListener(this)},this.connectPeripherals=function(a){z=a},this.powerOn=function(){w(),f()},this.powerOff=function(){},this.releaseControllers=function(){v()},this.resetControllers=function(){this.releaseControllers(),u()},this.readControllerPort=function(c){return a.netController?b.netGetMergedPortValues()[c]:this.readLocalControllerPort(c)},this.readLocalControllerPort=function(a){return a===J?U.pin8Value?63:L>M?16|U.portValue:U.portValue:63},this.writeControllerPin8Port=function(a,b){a===J&&(U.pin8Value=b)},this.controllersClockPulse=function(){J>=0&&K&&--L<=0&&(L=K)},this.toggleMode=function(a,c){if(!G)return void b.showErrorMessage("Touch Controls unavailable. Not a touch device!");var d;c?(d=a?J<0?1:0===J?-2:I-1:I-1)<-2&&(d=1):(d=a?0===J?1:-2===I?0:I+1:I+1)>1&&(d=-2),this.setMode(d),b.showStatusMessage("Touch Controls "+this.getModeDesc())},this.setMode=function(a){I=a,f()},this.getMode=function(){return I},this.getModeDesc=function(){switch(I){case-1:return"AUTO";case 0:return"ENABLED";case 1:return"ENABLED (port 2)";default:return G?"DISABLED":"NOT SUPPORTED"}},this.getSwappedState=function(){return 1===J},this.netClientAdaptToServerControlsModes=function(a){-1!==J&&(0!==J||a.sw?1===J&&a.sw&&this.setMode(0):this.setMode(1))},this.toggleDirBig=function(){N=!N,D.directionalBig=N,WMSX.userPreferences.setDirty(),this.controllersSettingsStateUpdate()},this.toggleMirrored=function(){O=!O,D.mirrored=O,WMSX.userPreferences.setDirty(),this.controllersSettingsStateUpdate()},this.isDirBig=function(){return N},this.isMirrored=function(){return O},this.getPortActive=function(){return J},this.setTurboFireClocks=function(a){K=a,M=K/2|0,L=0},this.getMappingForControl=function(a,b){return null},this.screenReadjustedUpdate=function(){ this.releaseControllers()},this.setupTouchControlsIfNeeded=function(a){function b(a,b){var c=wmsx.DOMTouchControls.createButton("wmsx-touch-"+b);c.wmsxControl=b,c.addEventListener("touchstart",n),c.addEventListener("touchmove",wmsx.Util.blockEvent),c.addEventListener("touchend",o),c.addEventListener("touchcancel",o),c.addEventListener("mousedown",n),c.addEventListener("mouseup",o),T[b]=c,a.appendChild(c)}if(!(P||J<0)){C=document.createElement("div"),C.id="wmsx-touch-speed";var c=document.createElement("div");c.id="wmsx-touch-pause",c.addEventListener("touchstart",q),c.addEventListener("mousedown",q),C.appendChild(c);var d=document.createElement("div");d.id="wmsx-touch-fast",d.addEventListener("touchstart",r),d.addEventListener("touchend",s),d.addEventListener("mousedown",r),d.addEventListener("mouseup",s),C.appendChild(d),a.appendChild(C);var f=document.createElement("div");f.id="wmsx-touch-left",b(f,wmsx.TouchControls.buttonsLeftSide[0]),P=wmsx.DOMTouchControls.createDirectional(),P.addEventListener("touchstart",h),P.addEventListener("touchmove",j),P.addEventListener("touchend",i),P.addEventListener("touchcancel",i),P.addEventListener("mousedown",g),f.appendChild(P),b(f,wmsx.TouchControls.buttonsLeftSide[1]),a.appendChild(f),f=document.createElement("div"),f.id="wmsx-touch-right";var k=wmsx.TouchControls.buttonsRightSide;for(var l in k)b(f,k[l]);a.appendChild(f),e(),t()}},this.startTouchDetection=function(a){E=a},this.stopTouchDetection=function(){E=null},this.customizeControl=function(a,b){"T_DIR"===a?D.directional=b:D.buttons[a]=b,this.updateMappingFor(a),WMSX.userPreferences.setDirty()},this.updateMappingFor=function(a){if("T_DIR"===a)P.wmsxMappingIsKeys="KEYBOARD"===D.directional,wmsx.DOMTouchControls.styleDirectionalMapping(P,D.directional);else{var b=T[a],c=D.buttons[a];b.wmsxMapping=c,wmsx.DOMTouchControls.styleButtonMapping(b,c)}},this.controllersSettingsStateUpdate=function(){var a=!!b.getSettingsState().touchActive;document.documentElement.classList.toggle("wmsx-touch-active",a),document.documentElement.classList.toggle("wmsx-dir-big",N),document.documentElement.classList.toggle("wmsx-touch-mirror",O),z.touchControlsActiveUpdate(a,N,O)},this.machinePowerAndUserPauseStateUpdate=function(a,b){V=a,W=b,C&&e()};var z,A,B,C,D,E,F=wmsx.MachineControls,G=wmsx.Util.isTouchDevice(),H=wmsx.Util.isMobileDevice(),I=WMSX.TOUCH_MODE>=1?WMSX.TOUCH_MODE-1:G?-1:-2,J=-1,K=0,L=0,M=0,N=!1,O=!1,P=null,Q=null,R=-1,S=0,T={},U=new x,V=!1,W=!1,X=wmsx.ControllersHub.TOUCH,Y=[15,14,6,7,5,13,9,11,10],Z=[[],["UP"],["RIGHT","UP"],["RIGHT"],["RIGHT","DOWN"],["DOWN"],["LEFT","DOWN"],["LEFT"],["LEFT","UP"]];this.saveState=function(){return{p:D}},this.loadState=function(a){if(v(),a.p){delete a.p.directionalBig,delete a.p.mirrored;for(var b in a.p)D[b]=a.p[b];for(var c in D.buttons){var d=D.buttons[c];d&&d.sn&&!d.c_en&&(d.c_en=d.sn)}P&&t()}}},wmsx.DOMTouchControls.createDirectional=function(a){function b(a){var b=document.createElement("div");b.classList.add("wmsx-touch-dir-"+a),c.appendChild(b);var d=document.createElement("div");d.classList.add("wmsx-arrow-"+a),c.appendChild(d)}var c=document.createElement("div");return a&&(c.id=a),c.classList.add("wmsx-touch-dir"),b("left"),b("right"),b("up"),b("down"),c},wmsx.DOMTouchControls.createButton=function(a){var b=document.createElement("div");return a&&(b.id=a),b.classList.add("wmsx-touch-button"),b},wmsx.DOMTouchControls.styleDirectionalMapping=function(a,b){a.classList.toggle("wmsx-touch-dir-key","KEYBOARD"===b),a.classList.toggle("wmsx-touch-dir-joy","KEYBOARD"!==b)},wmsx.DOMTouchControls.styleButtonMapping=function(a,b){if(a.innerHTML=b?b.n||b.c_en:"",b)if(b.button){a.classList.add("wmsx-touch-button-joy"),a.classList.remove("wmsx-touch-button-key","wmsx-touch-button-none");for(var c=["A","B","AB"],d=0;d=0?u%11:11+u;var b=u?60/v[u]|0:0;p.setTurboFireClocks(b),r.setTurboFireClocks(b),s.setTurboFireClocks(b),t.setTurboFireClocks(b),B.controllersSettingsStateUpdate(),B.showOSD("Turbo Fire"+(u?" speed: "+this.getTurboFireSpeedDesc():": OFF"),!0)},this.getTurboFireSpeedDesc=function(){return u?u+"x":"OFF"},this.getControlReport=function(a){switch(a){case wmsx.PeripheralControls.TOUCH_TOGGLE_DIR_BIG:var b=t.isDirBig();return{label:b?"ON":"OFF",active:b};case wmsx.PeripheralControls.TOUCH_TOGGLE_MIRRORED:var c=t.isMirrored();return{label:c?"ON":"OFF",active:c};case wmsx.PeripheralControls.HAPTIC_FEEDBACK_TOGGLE_MODE:return{label:x?"ON":"OFF",active:!!x};case wmsx.PeripheralControls.TURBO_FIRE_TOGGLE:return{label:this.getTurboFireSpeedDesc(),active:!!u}}return{label:"Unknown",active:!1}},this.setupTouchControlsIfNeeded=function(a){t.setupTouchControlsIfNeeded(a)},this.addKeyInputElement=function(a){a.addEventListener("keydown",this.keyDown),a.addEventListener("keyup",this.keyUp)},this.screenReadjustedUpdate=function(){t.screenReadjustedUpdate()},this.screenFullscreenStateUpdate=function(a){q.screenFullscreenStateUpdate(a)},this.keyDown=function(a){return h(a,!0)},this.keyUp=function(a){return h(a,!1)}, this.setMouseInputElement=function(a){q.setMouseInputElement(a)},this.setScreenPixelScale=function(a,b){q.setScreenPixelScale(a,b)},this.updateMouseConnections=function(a,b){k[0]=a,k[1]=b,d()},this.updateJoystickConnections=function(a,b){l[0]=a,l[1]=b,d()},this.updateJoykeysConnections=function(a,b){m[0]=a,m[1]=b,d()},this.updateTouchControlsConnections=function(a,b){n[0]=a,n[1]=b,d()},this.showStatusMessage=function(a){var b=k[0]||l[0]||m[0]||n[0]||" - -  ",c=k[1]||l[1]||m[1]||n[1]||" - -  ";B.showOSD((a?a+".  ":"")+"Port 1:  "+b+",  Port 2:  "+c,!0)},this.showErrorMessage=function(a){B.showOSD(a,!0,!0)},this.getSettingsState=function(){return o.mouseModeDesc=q.getModeDesc(),o.joysticksModeDesc=r.getModeDesc(),o.joykeysModeDesc=s.getModeDesc(),o.touchPortSet=t.getPortActive(),o.touchActive=j[0]===t||j[1]===t,o.ports[0]=k[0]||l[0]||m[0]||n[0]||wmsx.ControllersHub.NONE,o.ports[1]=k[1]||l[1]||m[1]||n[1]||wmsx.ControllersHub.NONE,o.turboFireSpeedDesc=this.getTurboFireSpeedDesc(),o},this.getMappingForControl=function(a,b){return j[b]&&j[b].getMappingForControl(a,b)},this.getMappingPopupText=function(a,b){return j[b]&&j[b].getMappingPopupText(a,b)},this.mappingPopupVisibility=function(a,b,c){c&&j[b]===r?r.startButtonDetection(b,a):r.stopButtonDetection()},this.customizeControl=function(a,b,c){j[b].customizeControl(a,b,c)},this.clearControl=function(a,b){return j[b].clearControl(a,b)},this.hapticFeedback=function(){x&&navigator.vibrate(8)},this.hapticFeedbackOnTouch=function(a){!x||"touchstart"!==a.type&&"touchend"!==a.type&&"touchmove"!==a.type||navigator.vibrate(8)};var h=function(a,b){a.returnValue=!1,a.preventDefault(),a.stopPropagation();var c=i.codeNewForKeyboardEvent(a);return s.processKey(c,b),!1};this.netGetInfoToSend=function(){var a=q.netGetMouseStateToSend();return a||A?{m:a,p:A}:void 0},this.netClearInfoToSend=function(){A=void 0,q.netClearMouseInfoToSend()},this.netServerGetFullInfo=function(){return{m:q.netServerGetMouseState(),p:C}},this.netGetMergedPortValues=function(){return C},this.netClientReceiveServerInfo=function(a){a.m&&q.netClientReceiveServerMouseState(a.m);var b=a.p;b&&(C[0]=b[0],C[1]=b[1])},this.netServerReceiveClientInfo=function(a,b){b.m&&q.netServerReceiveClientMouseState(b.m);var c=b.p;c&&(F=!0,a.controllersPortValues=c[0]!==z||c[1]!==z?c:void 0)},this.netServerClearClientsMergedInfo=function(){E[0]=z,E[1]=z,F=!1},this.netServerGetControlsModes=function(){return{m:q.getModeEffective(),sw:s.getSwappedState()||r.getSwappedState()||t.getSwappedState()}},this.netClientGetControlsModes=function(){return{k:s.getMode(),j:r.getMode(),m:q.getModeEffective(),t:t.getMode()}},this.netClientRestoreControlsModes=function(a){s.setMode(a.k),r.setMode(a.j),q.setModeEffective(a.m),t.setMode(a.t)},this.netClientAdaptToServerControlsModes=function(a){s.netClientAdaptToServerControlsModes(a),r.netClientAdaptToServerControlsModes(a),q.netClientAdaptToServerControlsModes(a),t.netClientAdaptToServerControlsModes(a)},this.saveState=function(){return{jk:y,t:t.saveState(),h:x}},this.loadState=function(a){void 0!==a.jk&&(y=a.jk,z=63|y,this.portValueAllReleased=z),a.t&&t.loadState(a.t),void 0!==a.h&&(x=a.h&&w)};var i=wmsx.DOMKeys,j=[null,null],k=[null,null],l=[null,null],m=[null,null],n=[null,null],o={ports:[null,null]},p=new wmsx.DOMKeyboard(this,a,b),q=new wmsx.DOMMouseControls(a,this),r=new wmsx.GamepadJoysticksControls(a,this,p),s=new wmsx.DOMJoykeysControls(a,this,p),t=new wmsx.DOMTouchControls(a,this,p,b),u=0,v=[0,2,2.4,3,4,5,6,7.5,10,12,15],w=!!navigator.vibrate,x=w&&!!WMSX.userPreferences.current.hapticFeedback,y=0!==WMSX.KEYBOARD_JAPAN_LAYOUT?64:0,z=63|y;this.portValueAllReleased=z;var A,B,C=[z,z],D=[z,z],E=[z,z],F=!1;wmsx.ControllersHub.hapticFeedback=this.hapticFeedback,wmsx.ControllersHub.hapticFeedbackOnTouch=this.hapticFeedbackOnTouch},wmsx.ControllersHub.MOUSE="MOUSE",wmsx.ControllersHub.JOYSTICK="JOYSTICK",wmsx.ControllersHub.JOYKEYS="JOYKEYS",wmsx.ControllersHub.TOUCH="TOUCH",wmsx.ControllersHub.JOY_ANY="JOY",wmsx.ControllersHub.NONE="NO DEVICE",wmsx.DOMMachineControls=function(a,b){"use strict";function c(b,c,e,f){if(2===a.netPlayMode&&(T.has(b)||U.has(b)))return a.showOSD("Function not available in NetPlay Client mode",!0,!0);1===a.netPlayMode&&T.has(b)||n.push({c:b<<4|e<<1|c,d:f}),2!==a.netPlayMode&&d(b,c,e,f)}function d(a,b,c,d){g.controlStateChanged(a,b,c,d),S.has(a)&&h.quickOptionsControlsStateUpdate()}this.connect=function(a){g=a},this.connectPeripherals=function(a){h=a},this.powerOn=function(){e()},this.powerOff=function(){},this.processKey=function(a,d){var e=a&R,f=k[e];return!f||m[a]?b.processKey(a,d):d===l[e]||(l[e]=d,c(f,d,e!==a),!0)},this.processControlState=c,this.getControlReport=function(a){return g.getControlReport(a)};var e=function(){window.onhelp=function(){return!1}},f=function(){var a=i;k[o]=j.POWER,k[o|a.ALT]=j.POWER,k[u|a.CONTROL]=j.PAUSE_CPU,k[u|a.CONTROL|a.ALT]=j.PAUSE_CPU,k[v|a.CONTROL|a.ALT]=j.PAUSE_CPU,k[p]=j.FAST_SPEED,k[p|a.ALT]=j.FAST_SPEED,k[q|a.ALT]=j.INC_SPEED,k[r|a.ALT]=j.DEC_SPEED,k[s|a.ALT]=j.NORMAL_SPEED,k[t|a.ALT]=j.MIN_SPEED,m[q|a.ALT]=!0,m[r|a.ALT]=!0,m[s|a.ALT]=!0,m[t|a.ALT]=!0,k[u]=j.PAUSE,k[u|a.ALT]=j.PAUSE,k[v|a.ALT]=j.PAUSE,k[w|a.ALT]=j.FRAME,k[x|a.ALT]=j.FRAME,k[y|a.ALT]=j.DEBUG,k[z|a.ALT]=j.SPRITE_MODE,k[A|a.ALT]=j.VIDEO_STANDARD,k[B|a.ALT]=j.CPU_CLOCK_MODE,k[C|a.ALT]=j.VDP_CLOCK_MODE,k[D|a.CONTROL|a.ALT]=j.SAVE_STATE_0,k[E|a.CONTROL|a.ALT]=j.SAVE_STATE_0,k[F|a.CONTROL|a.ALT]=j.SAVE_STATE_1,k[G|a.CONTROL|a.ALT]=j.SAVE_STATE_2,k[H|a.CONTROL|a.ALT]=j.SAVE_STATE_3,k[I|a.CONTROL|a.ALT]=j.SAVE_STATE_4,k[J|a.CONTROL|a.ALT]=j.SAVE_STATE_5,k[K|a.CONTROL|a.ALT]=j.SAVE_STATE_6,k[L|a.CONTROL|a.ALT]=j.SAVE_STATE_7,k[M|a.CONTROL|a.ALT]=j.SAVE_STATE_8,k[N|a.CONTROL|a.ALT]=j.SAVE_STATE_9,k[O|a.CONTROL|a.ALT]=j.SAVE_STATE_10,k[P|a.CONTROL|a.ALT]=j.SAVE_STATE_11,k[Q|a.CONTROL|a.ALT]=j.SAVE_STATE_12,k[D|a.ALT]=j.LOAD_STATE_0,k[E|a.ALT]=j.LOAD_STATE_0,k[F|a.ALT]=j.LOAD_STATE_1,k[G|a.ALT]=j.LOAD_STATE_2,k[H|a.ALT]=j.LOAD_STATE_3,k[I|a.ALT]=j.LOAD_STATE_4,k[J|a.ALT]=j.LOAD_STATE_5,k[K|a.ALT]=j.LOAD_STATE_6,k[L|a.ALT]=j.LOAD_STATE_7,k[M|a.ALT]=j.LOAD_STATE_8,k[N|a.ALT]=j.LOAD_STATE_9,k[O|a.ALT]=j.LOAD_STATE_10,k[P|a.ALT]=j.LOAD_STATE_11,k[Q|a.ALT]=j.LOAD_STATE_12};this.netGetControlsToSend=function(){return n.length?n:void 0},this.netClearControlsToSend=function(){n.length=0},this.netServerProcessControlsChanges=function(a){for(var b=0,c=a.length;b>4)||n.push(e),d(e.c>>4,1&e.c,2&e.c,e.d)}},this.netClientApplyControlsChanges=function(a){for(var b=0,c=a.length;b>4,1&e.c,2&e.c,e.d)}};var g,h,i=wmsx.DOMKeys,j=wmsx.MachineControls,k={},l={},m={},n=new Array(100);n.length=0;var o=i.VK_F11.wc,p=i.VK_F12.wc,q=i.VK_UP.wc,r=i.VK_DOWN.wc,s=i.VK_RIGHT.wc,t=i.VK_LEFT.wc,u=i.VK_F8.wc,v=i.VK_P.wc,w=i.VK_O.wc,x=i.VK_F.wc,y=i.VK_D.wc,z=i.VK_S.wc,A=i.VK_Q.wc,B=i.VK_T.wc,C=i.VK_Y.wc,D=i.VK_QUOTE.wc,E=i.VK_BACKQUOTE.wc,F=i.VK_1.wc,G=i.VK_2.wc,H=i.VK_3.wc,I=i.VK_4.wc,J=i.VK_5.wc,K=i.VK_6.wc,L=i.VK_7.wc,M=i.VK_8.wc,N=i.VK_9.wc,O=i.VK_0.wc,P=i.VK_MINUS.wc,Q=i.VK_EQUALS.wc,R=~i.SHIFT,S=new Set([j.VIDEO_STANDARD,j.CPU_CLOCK_MODE,j.Z80_CLOCK_MODE,j.R800_CLOCK_MODE,j.VDP_CLOCK_MODE,j.SPRITE_MODE,j.VSYNCH]),T=new Set([j.SAVE_STATE_0,j.SAVE_STATE_1,j.SAVE_STATE_2,j.SAVE_STATE_3,j.SAVE_STATE_4,j.SAVE_STATE_5,j.SAVE_STATE_6,j.SAVE_STATE_7,j.SAVE_STATE_8,j.SAVE_STATE_9,j.SAVE_STATE_10,j.SAVE_STATE_11,j.SAVE_STATE_12,j.SAVE_STATE_FILE,j.LOAD_STATE_0,j.LOAD_STATE_1,j.LOAD_STATE_2,j.LOAD_STATE_3,j.LOAD_STATE_4,j.LOAD_STATE_5,j.LOAD_STATE_6,j.LOAD_STATE_7,j.LOAD_STATE_8,j.LOAD_STATE_9,j.LOAD_STATE_10,j.LOAD_STATE_11,j.LOAD_STATE_12,j.TRACE]),U=new Set([j.VSYNCH]);!function(){f()}()},wmsx.DOMVirtualKeyboard=function(a,b,c){"use strict";function d(a){a.addEventListener("touchstart",e),a.addEventListener("mousedown",e), a.addEventListener("touchend",f),a.addEventListener("mouseup",f)}function e(a){h(a);var c=a.target.wmsxKey;c&&(b.processMSXKey(c,!0),"SHIFT"===c&&g())}function f(a){h(a);var c=a.target.wmsxKey;c&&(b.processMSXKey(c,!1),"SHIFT"===c&&g())}function g(){var a=b.isShiftPressed();a!==k&&(k=a,j&&wmsx.VirtualKeyboard.updateKeysLabels(j,k,l,m))}function h(a){a.stopPropagation(),a.preventDefault()}var i=this;this.machineTypeStateUpdate=function(){var a=c.getMachineLang(),b=c.getCodeKeyLabel();a===l&&b===m||(l=a,m=b,j&&wmsx.VirtualKeyboard.updateKeysLabels(j,k,l,m))};var j,k=!1,l="en",m="CODE";!function(){c.addMachineTypeStateListener(i),j=wmsx.VirtualKeyboard.create(a,d,k,l,m)}()},wmsx.ScreenGUI=wmsx.Util.isMobileDevice()?{BAR_HEIGHT:29,BAR_MENU_WIDTH:160,BAR_MENU_ITEM_HEIGHT:33,BAR_MENU_ITEM_FONT_SIZE:14,LOGO_SCREEN_WIDTH:597,LOGO_SCREEN_HEIGHT:455,TOUCH_CONTROLS_LEFT_WIDTH:119,TOUCH_CONTROLS_LEFT_WIDTH_BIG:143,TOUCH_CONTROLS_RIGHT_WIDTH:80}:{BAR_HEIGHT:29,BAR_MENU_WIDTH:150,BAR_MENU_ITEM_HEIGHT:29,BAR_MENU_ITEM_FONT_SIZE:13,LOGO_SCREEN_WIDTH:597,LOGO_SCREEN_HEIGHT:455,TOUCH_CONTROLS_LEFT_WIDTH:119,TOUCH_CONTROLS_LEFT_WIDTH_BIG:143,TOUCH_CONTROLS_RIGHT_WIDTH:80},wmsx.ScreenGUI.html=function(){return'

Drive A

Drive B

Hard Drive

Cartridge 1

Cartridge 2

Cassette
Swipe up/down on the Screen
to hide the browser bars!
'},wmsx.ScreenGUI.auxHtml=function(){return' WebMSX: 2nd Video